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

Exclude a directory from getting zipped using zipfile module in python

我正在尝试使用 python zipfile 模块及其工作 well.But 压缩目录,现在我想排除一些 folders.ie 如果我的目录树像

abc
def
ghi
jkl
mno

然后我想将所有存档到 myfile.zip 但不包括 "ghi"

我正在尝试使用

压缩文件
zf = zipfile.ZipFile("Application server.zip", "w")
for dirname, subdirs, files in os.walk("D:\review docs"):
    zf.write(dirname)
    for filename in files:
        zf.write(os.path.join(dirname, filename))
zf.close()

所以这是将 "D:\review docs" 下的所有内容归档到 "Application server.zip",但我想从 zip 中排除一些目录。 事实上,我可以使用 linux 命令来做同样的事情,但我想使用 zipfile 模块。 另外,如果我从 os.walk 中选择的 "dirname" 列表中弹出排除文件夹名称,那行得通吗? 在压缩之前进一步添加一个检查,比如 if "dirname"=="exlude folder" 我认为也可以工作,但我想要一个使用 module.I 阅读一些 zipfile 模块提供的地方来做同样的事情的巧妙解决方案此功能,但未找到相同的代码示例。

是的,您可以从子目录中删除元素,这将确保 os.walk() 不会进入那些目录。例子-

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()

我写了一个更完整的版本,可以过滤文件夹和exts

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

它将文件夹压缩为 zip 文件,保持其结构并过滤某些文件夹和扩展,就像您自然期望的那样。

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('\/')

    if ignoreDir:
        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=None, ignoreExt=None):
    # 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=None, ignoreExt=None, close=False):
    rootDir = path if os.path.isdir(path) else os.path.dirname(path)

    try:
        zipDirHelper(path, rootDir, zf, ignoreDir, ignoreExt)
    finally:
        if close:
            zf.close()

像这样使用它:

import zipfile
theZipFile = zipfile.ZipFile(targetZipFile, 'w')
Util.ZipDir(target_dir, theZipFile, ignoreDir=[".svn"], ignoreExt=[".zip"], close=True)
# If you like to zip more files, just close=False and manually close the file or use "with xxx" on your own