[英]Exclude a directory from getting zipped using zipfile module in python
我正在嘗試使用 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”列表中彈出排除文件夾名稱,那會起作用嗎? 進一步在壓縮之前添加一個檢查,比如“dirname”==“exlude folder”也可以工作,我認為但我想要一個使用模塊做同樣事情的簡潔解決方案。我讀了一些 zipfile 模塊提供此功能但沒有的地方t 找到了相同的代碼示例。
是的,您可以從 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()
我寫了一個更完整的版本,它能夠過濾文件夾和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('\\/')
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"])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.