我正在尝试使用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模块提供此功能的地方,但没有找到相同的代码示例。
答案 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"])