使用python中的zipfile模块从压缩中排除目录

2024-10-01 00:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用pythonzipfile模块压缩一个目录及其工作方式好吧。但是现在我想排除一些文件夹.ie如果我的导演树像

abc
def
ghi
jkl
mno

然后我要把所有文件归档到我的文件.zip但不包括“ghi”

我正在尝试使用压缩文件

^{pr2}$

所以这是将“D:\ review docs”下的所有内容归档到“Application”服务器.zip“但是我想从zip中排除一些目录。 事实上,我可以使用linux命令来做同样的事情,但是我想使用zipfile模块。 如果我弹出从“dirname”列表中排除文件夹名手术室步行,行吗? 在压缩之前再加上一个检查,比如“dirname”==“exlude folder”也可以,但我想找到一个使用该模块做同样操作的简洁解决方案。我读过一些zipfile模块提供此功能的地方,但没有找到任何相同的代码示例。在


Tags: 模块文件目录文件夹def方式jklzip
2条回答

我写了一个更完整的版本,它能够过滤文件夹和ext

我们不能简单地在压缩之前删除.svn这样的文件夹。下面的代码可以帮助您。在

它将一个文件夹压缩成一个zip文件,保持它的结构并过滤某些文件夹和ext,就像你所期望的那样。在

def IsPathValid(path, ignoreDir, ignoreExt):
    splited = None
    if os.path.isfile(path):
        if ignoreExt:
            _, ext = os.path.splitext(path)
            if ext in ignoreExt:
                return False

        splited = os.path.dirname(path).split('\\/')
    else:
        if not ignoreDir:
            return True
        splited = path.split('\\/')

    for s in splited:
        if s in ignoreDir:  # You can also use set.intersection or [x for],
            return False

    return True

def zipDirHelper(path, rootDir, zf, ignoreDir = [], ignoreExt = []):
    # zf is zipfile handle
    if os.path.isfile(path):
        if IsPathValid(path, ignoreDir, ignoreExt):
            relative = os.path.relpath(path, rootDir)
            zf.write(path, relative)
        return

    ls = os.listdir(path)
    for subFileOrDir in ls:
        if not IsPathValid(subFileOrDir, ignoreDir, ignoreExt):
            continue

        joinedPath = os.path.join(path, subFileOrDir)
        zipDirHelper(joinedPath, rootDir, zf, ignoreDir, ignoreExt)

def ZipDir(path, zf, ignoreDir = [], ignoreExt = []):
    rootDir = path if os.path.isdir(path) else os.path.dirname(path)
    zipDirHelper(path, rootDir, zf, ignoreDir, ignoreExt)
    pass

这样使用:

^{pr2}$

是的,您可以从细分曲面中删除元素,这样可以确保手术室步行()不在这些目录中。示例-

for dirname, subdirs, files in os.walk("D:\\review docs"):
    if 'exclude directory' in subdirs:
        subdirs.remove('exclude directory')
    zf.write(dirname)
    for filename in files:
        zf.write(os.path.join(dirname, filename))
zf.close()

相关问题 更多 >