簡體   English   中英

使用python中的zipfile模塊從壓縮文件中排除目錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM