在python

时间:2015-08-03 04:21:25

标签: python zipfile

我正在尝试使用python zipfile模块压缩目录并且它运行良好。但是现在我想要排除一些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"到"应用服务器.zip"但我想从zip中排除一些目录。 实际上我可以使用linux命令来做同样的事情,但我想使用zipfile模块。 此外,如果我弹出排除文件夹名称" dirname"从os.walk获得的列表,那会有用吗? 在压缩之前添加支票,如果" dirname" ==" exlude folder"也会工作我想但我想要一个简洁的解决方案,使用该模块做同样的事情。我读了一些zipfile模块提供此功能的地方,但没有找到相同的代码示例。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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

在压缩之前,我们不能简单地删除.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

像这样使用它:

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