【问题标题】:Exclude a directory from getting zipped using zipfile module in python在 python 中使用 zipfile 模块将目录排除在压缩之外
【发布时间】:2015-10-25 02:15:07
【问题描述】:

我正在尝试使用 python zipfile 模块压缩目录并且它运行良好。但现在我想排除一些文件夹。即如果我的目录树像

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”==“exlude folder”也可以工作,但我想要一个使用模块做同样事情的巧妙解决方案。我读了一些zipfile模块提供此功能但没有的地方没有找到任何相同的代码示例。

【问题讨论】:

    标签: python zipfile


    【解决方案1】:

    是的,您可以从 subdirs 中删除元素,这将确保 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()
    

    【讨论】:

    • 这实际上并没有回答问题。它如何排除“ghi”?
    • 如果你从 os.walk() 的 'subdirs' (第二个参数) 中删除一些东西, os.walk() 不会进入它,这样整个目录就会被跳过。详情docs.python.org/3/library/os.html#os.walk
    【解决方案2】:

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

    我们不能在压缩之前简单地删除 .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('\\/')
    
        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
    

    像这样使用它:

    import zipfile
    theZipFile = zipfile.ZipFile(targetZipFile, 'w')
    Util.ZipDir(target_dir, theZipFile, ignoreDir=[".svn"], ignoreExt=[".zip"])
    
    

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2022-11-10
      • 2011-05-09
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      相关资源
      最近更新 更多