zipfile 在 Python 中壓縮和解壓縮 ZIP 文件

商業

Python 標準庫的 zipfile 模塊可用於將文件壓縮成 ZIP 和解壓縮 ZIP 文件。它包含在標準庫中,因此無需額外安裝。

以下內容進行說明。

  • 將多個文件壓縮成一個 ZIP 文件
  • 將新文件添加到現有 ZIP 文件
  • 將目錄(文件夾)壓縮成 ZIP 文件
  • 壓縮成帶有密碼的 ZIP 文件
  • 檢查 ZIP 文件的內容。
  • 提取(解壓縮)ZIP 文件的全部內容。
  • 選擇 ZIP 文件的內容並將其解壓縮。

將多個文件壓縮成一個 ZIP 文件

創建一個 ZipFile 對象並使用 write() 方法添加要壓縮的文件。

要創建一個新的 ZIP 文件,指定要創建的 ZIP 文件的路徑作為 ZipFile 對象的構造函數的第一個參數,第二個參數如下w'

此外,可以將壓縮方法指定為第三個參數。

  • zipfile.ZIP_STORED:只需合併多個文件而不壓縮(默認)
  • zipfile.ZIP_DEFLATED:普通 ZIP 壓縮(需要 zlib 模塊)
  • zipfile.ZIP_BZIP2:BZIP2 壓縮(需要 bz2 模塊)
  • zipfile.ZIP_LZMA:LZMA 壓縮(需要 lzma 模塊)

BZIP2和LZMA的壓縮比更高(可以壓縮到更小的尺寸),但壓縮所需的時間更長。

在 write() 方法中,具有第一個參數 filename 的文件被寫入具有第二個參數 arcname 的 ZIP 文件。如果省略 arcname,則按原樣使用文件名。 arcname 還可以指定目錄結構。

ZipFile 對象需要使用 close() 方法關閉,但如果使用 with 語句,則在 block 結束時會自動關閉。

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

通過指定 write() 方法的 compress_type 參數,也可以為每個文件選擇壓縮方法。

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

將新文件添加到現有 ZIP 文件

要將新文件添加到現有 zip 文件,請在創建 ZipFile 對象時將構造函數的第一個參數設置為現有 zip 文件的路徑。此外,如下設置第二個參數模式。a'

然後,如上例所示,只需使用 write() 方法添加文件。

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

將目錄(文件夾)壓縮成 ZIP 文件

如果要將整個目錄(文件夾)壓縮成單個 ZIP 文件,可以使用 os.scandir() 或 os.listdir() 來製作文件列表,但在shutil中使用make_archive()更容易模塊。

請參閱以下文章。

壓縮成帶有密碼的 ZIP 文件

zipfile 模塊不允許您創建受密碼保護的 ZIP。如果要將文件壓縮為受密碼保護的 zip 文件,請使用第三方庫 pyminizip。

請注意,受密碼保護的 ZIP 的解壓縮可以使用 zipfile 模塊完成(見下文)。

檢查 ZIP 文件的內容。

您可以檢查現有 ZIP 文件的內容。

通過將構造函數中的第一個參數文件設置為現有 zip 文件的路徑並將第二個參數模式設置為“r”來創建一個 ZipFile 對象。 mode 參數可以省略,因為默認值為 ‘r’。

您可以使用 ZipFile 對象的 namelist() 方法來獲取存檔文件的列表。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

提取(解壓縮)ZIP 文件的全部內容。

要解壓 ZIP 文件的內容,請創建一個 ZipFile 對象,構造函數中的第一個參數文件作為現有 ZIP 文件的路徑,第二個參數模式為“r”,如上例所示。 mode 參數可以省略,因為它默認為 ‘r’。

ZipFile 對象的 extractall() 方法提取(解壓縮)ZIP 文件的全部內容。第一個參數 path 指定要提取到的目錄的路徑。如果省略,文件將被提取到當前目錄。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

可以通過將密碼指定為 extractall() 方法的參數 pwd 來提取帶有密碼的 ZIP 文件。

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

選擇 ZIP 文件的內容並將其解壓縮。

如果您只想解壓和提取某些文件,請使用 extract() 方法。

extract() 方法的第一個參數是要提取的文件的名稱,第二個參數 path 是要提取到的目錄的路徑。如果省略路徑參數,文件將被提取到當前目錄。要提取的文件的名稱應包括 ZIP 文件中目錄的路徑(如果該目錄存儲在該目錄中)。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

與 extractall() 方法一樣,extract() 方法也允許您指定密碼作為參數 pwd。

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')
Copied title and URL