在 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
我正在尝试使用 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