zipfile — 處理 ZIP 壓縮文件

原始碼: Lib/zipfile/


ZIP 檔案格式是一種常見的存檔和壓縮標準。該模組提供了建立、讀取、寫入、追加和列出 ZIP 檔案的工具。任何對該模組的高階使用都需要了解該格式,如 PKZIP 應用說明 中所定義。

此模組目前不處理多磁碟 ZIP 檔案。它可以處理使用 ZIP64 擴充套件的 ZIP 檔案(即大小超過 4 GiB 的 ZIP 檔案)。它支援解密 ZIP 壓縮文件中的加密檔案,但目前無法建立加密檔案。解密速度非常慢,因為它是在原生 Python 而不是 C 中實現的。

該模組定義了以下專案

exception zipfile.BadZipFile

針對錯誤的 ZIP 檔案引發的錯誤。

3.2 版本新增。

exception zipfile.BadZipfile

BadZipFile 的別名,用於與舊版本的 Python 相容。

3.2 版本開始棄用。

exception zipfile.LargeZipFile

當 ZIP 檔案需要 ZIP64 功能但該功能未啟用時引發的錯誤。

class zipfile.ZipFile

用於讀取和寫入 ZIP 檔案的類。有關建構函式的詳細資訊,請參閱 ZipFile 物件 部分。

class zipfile.Path

實現 pathlib.Path 提供的介面子集的類,包括完整的 importlib.resources.abc.Traversable 介面。

3.8 版本新增。

class zipfile.PyZipFile

用於建立包含 Python 庫的 ZIP 壓縮文件的類。

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

用於表示有關壓縮文件成員資訊的類。此類的例項由 getinfo()infolist() 方法返回 ZipFile 物件。大多數 zipfile 模組的使用者不需要建立這些物件,而只需使用此模組建立的物件。filename 應該是壓縮文件成員的完整名稱,date_time 應該是一個包含六個欄位的元組,用於描述檔案上次修改的時間;這些欄位在 ZipInfo 物件 部分中進行了描述。

在 3.13 版本中更改: 添加了一個公共 compress_level 屬性來公開以前受保護的 _compresslevel。為了向後相容,較舊的受保護名稱繼續作為屬性工作。

zipfile.is_zipfile(filename)

如果 filename 基於其魔數是有效的 ZIP 檔案,則返回 True,否則返回 Falsefilename 也可以是檔案或類檔案物件。

在 3.1 版本中更改: 支援檔案和類檔案物件。

zipfile.ZIP_STORED

未壓縮的存檔成員的數字常量。

zipfile.ZIP_DEFLATED

常規 ZIP 壓縮方法的數字常量。這需要 zlib 模組。

zipfile.ZIP_BZIP2

BZIP2 壓縮方法的數字常量。這需要 bz2 模組。

3.3 版本新增。

zipfile.ZIP_LZMA

LZMA 壓縮方法的數字常量。這需要 lzma 模組。

3.3 版本新增。

註解

自 2001 年以來,ZIP 檔案格式規範已包含對 bzip2 壓縮的支援,自 2006 年以來已包含對 LZMA 壓縮的支援。但是,某些工具(包括較舊的 Python 版本)不支援這些壓縮方法,可能會拒絕處理整個 ZIP 檔案,或者無法提取單個檔案。

另請參閱

PKZIP 應用說明

關於 ZIP 檔案格式的文件,由該格式和所用演算法的建立者 Phil Katz 編寫。

Info-ZIP 主頁

有關 Info-ZIP 專案的 ZIP 存檔程式和開發庫的資訊。

ZipFile 物件

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)

開啟一個 ZIP 檔案,其中 file 可以是檔案路徑(字串)、類檔案物件或 路徑類物件

mode 引數應該是 'r' 以讀取現有檔案,'w' 以截斷並寫入新檔案,'a' 以追加到現有檔案,或 'x' 以獨佔建立並寫入新檔案。 如果 mode'x' 並且 file 指向一個現有檔案,則會引發 FileExistsError。 如果 mode'a' 並且 file 指向一個現有的 ZIP 檔案,則會將其他檔案新增到其中。如果 file 沒有指向 ZIP 檔案,則會將一個新的 ZIP 存檔追加到該檔案。這旨在將 ZIP 存檔新增到另一個檔案(例如 python.exe)。如果 mode'a' 且檔案根本不存在,則會建立該檔案。如果 mode'r''a',則該檔案應該是可查詢的。

compression 是寫入存檔時要使用的 ZIP 壓縮方法,應該是 ZIP_STOREDZIP_DEFLATEDZIP_BZIP2ZIP_LZMA;無法識別的值將導致引發 NotImplementedError。 如果指定了 ZIP_DEFLATEDZIP_BZIP2ZIP_LZMA,但相應的模組(zlibbz2lzma)不可用,則會引發 RuntimeError。 預設值為 ZIP_STORED

如果 allowZip64True(預設值),則當 zip 檔案大於 4 GiB 時,zipfile 將建立使用 ZIP64 副檔名的 ZIP 檔案。如果為 false,則當 ZIP 檔案需要 ZIP64 副檔名時,zipfile 將引發異常。

compresslevel 引數控制將檔案寫入存檔時使用的壓縮級別。當使用 ZIP_STOREDZIP_LZMA 時,它不起作用。當使用 ZIP_DEFLATED 時,接受整數 09(有關詳細資訊,請參見 zlib)。當使用 ZIP_BZIP2 時,接受整數 19(有關詳細資訊,請參見 bz2)。

strict_timestamps 引數設定為 False 時,允許壓縮早於 1980-01-01 的檔案,但代價是將時間戳設定為 1980-01-01。 對於晚於 2107-12-31 的檔案,也會出現類似的行為,時間戳也會設定為該限制值。

當模式為 'r' 時,可以將 metadata_encoding 設定為編解碼器的名稱,該名稱將用於解碼成員名稱和 ZIP 註釋等元資料。

如果檔案是以模式 'w''x''a' 建立,然後在未向存檔新增任何檔案的情況下 closed,則會將空存檔的相應 ZIP 結構寫入該檔案。

ZipFile 也是一個上下文管理器,因此支援 with 語句。在示例中,myzipwith 語句的套件完成後關閉,即使發生異常也是如此

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

註解

metadata_encoding 是 ZipFile 的例項級設定。目前無法在每個成員的基礎上進行設定。

此屬性是為那些使用當前區域設定編碼或內碼表(主要在 Windows 上)生成具有名稱的存檔的舊版實現提供的解決方法。根據 .ZIP 標準,元資料的編碼可以透過存檔標頭中的標誌指定為 IBM 內碼表(預設)或 UTF-8。該標誌優先於 metadata_encoding,後者是 Python 特有的擴充套件。

在 3.2 版本中更改: 增加了將 ZipFile 用作上下文管理器的功能。

在 3.3 版本中更改: 增加了對 bzip2lzma 壓縮的支援。

在 3.4 版本中更改: 預設啟用 ZIP64 擴充套件。

在 3.5 版本中更改: 增加了對寫入不可查詢的流的支援。增加了對 'x' 模式的支援。

在 3.6 版本中更改: 以前,對於無法識別的壓縮值,會引發一個簡單的 RuntimeError

在 3.6.2 版本中更改: file 引數接受 路徑類物件

在 3.7 版本中更改: 添加了 compresslevel 引數。

在 3.8 版本中更改: strict_timestamps 僅關鍵字引數。

在 3.11 版本中更改: 增加了對指定 zip 檔案目錄和檔案頭中讀取元資料的成員名稱編碼的支援。

ZipFile.close()

關閉存檔檔案。在退出程式之前必須呼叫 close(),否則將不會寫入基本記錄。

ZipFile.getinfo(name)

返回一個 ZipInfo 物件,其中包含有關存檔成員 name 的資訊。對當前未包含在存檔中的名稱呼叫 getinfo() 將引發 KeyError

ZipFile.infolist()

返回一個列表,其中包含歸檔檔案中每個成員的 ZipInfo 物件。如果開啟的是現有歸檔檔案,則物件的順序與其在磁碟上實際 ZIP 檔案中的條目順序相同。

ZipFile.namelist()

按名稱返回歸檔檔案成員的列表。

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

將歸檔檔案的成員作為類似二進位制檔案的物件訪問。name 可以是歸檔檔案中的檔名或 ZipInfo 物件。如果包含 mode 引數,則必須是 'r'(預設)或 'w'pwd 是用於解密加密 ZIP 檔案的密碼,型別為 bytes 物件。

open() 也是一個上下文管理器,因此支援 with 語句。

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

mode'r' 時,類似檔案的物件 (ZipExtFile) 是隻讀的,並提供以下方法:read()readline()readlines()seek()tell()__iter__()__next__()。這些物件可以獨立於 ZipFile 執行。

mode='w' 時,將返回一個可寫的檔案控制代碼,該控制代碼支援 write() 方法。當可寫檔案控制代碼開啟時,嘗試讀取或寫入 ZIP 檔案中的其他檔案將引發 ValueError

在這兩種情況下,類似檔案的物件還具有屬性 name,它等效于歸檔檔案中的檔名;以及屬性 mode,它取決於輸入模式,為 'rb''wb'

寫入檔案時,如果檔案大小事先未知,但可能超過 2 GiB,請傳遞 force_zip64=True 以確保標頭格式能夠支援大檔案。如果事先知道檔案大小,請構造一個設定了 file_sizeZipInfo 物件,並將其用作 name 引數。

註解

open()read()extract() 方法可以接受檔名或 ZipInfo 物件。當您嘗試讀取包含具有重複名稱的成員的 ZIP 檔案時,您會體會到這一點。

在 3.6 版本中更改: 刪除了對 mode='U' 的支援。對於以 通用換行符 模式讀取壓縮文字檔案,請使用 io.TextIOWrapper

在 3.6 版本中更改: ZipFile.open() 現在可以使用 mode='w' 選項將檔案寫入歸檔檔案。

在 3.6 版本中更改: 在已關閉的 ZipFile 上呼叫 open() 將引發 ValueError。以前,會引發 RuntimeError

在 3.13 版本中更改: 為可寫類檔案物件添加了屬性 namemode。可讀類檔案物件的 mode 屬性的值從 'r' 更改為 'rb'

ZipFile.extract(member, path=None, pwd=None)

從歸檔檔案中提取一個成員到當前工作目錄;member 必須是其完整名稱或一個 ZipInfo 物件。其檔案資訊將盡可能準確地提取。path 指定要提取到的其他目錄。member 可以是檔名或 ZipInfo 物件。pwd 是用於加密檔案的密碼,型別為 bytes 物件。

返回建立的規範化路徑(目錄或新檔案)。

註解

如果成員檔名是絕對路徑,則會剝離驅動器/UNC 共享點和前導(反)斜槓,例如:///foo/bar 在 Unix 上變為 foo/barC:\foo\bar 在 Windows 上變為 foo\bar。並且成員檔名中的所有 ".." 元件都將被刪除,例如:../../foo../../ba..r 變為 foo../ba..r。在 Windows 上,非法字元 (:<>|"?*) 將被下劃線 (_) 替換。

在 3.6 版本中更改: 在已關閉的 ZipFile 上呼叫 extract() 將引發 ValueError。以前,會引發 RuntimeError

在 3.6.2 版本中更改: path 引數接受一個 類路徑物件

ZipFile.extractall(path=None, members=None, pwd=None)

從歸檔檔案中提取所有成員到當前工作目錄。path 指定要提取到的其他目錄。members 是可選的,必須是 namelist() 返回的列表的子集。pwd 是用於加密檔案的密碼,型別為 bytes 物件。

警告

切勿在未事先檢查的情況下從不受信任的來源提取歸檔檔案。可能會在path之外建立檔案,例如,成員具有以 "/" 開頭的絕對檔名或帶有兩個點 ".." 的檔名。此模組嘗試防止這種情況發生。請參閱 extract() 註釋。

在 3.6 版本中更改: 在已關閉的 ZipFile 上呼叫 extractall() 將引發 ValueError。以前,會引發 RuntimeError

在 3.6.2 版本中更改: path 引數接受一個 類路徑物件

ZipFile.printdir()

將歸檔檔案的目錄表列印到 sys.stdout

ZipFile.setpassword(pwd)

設定 pwd (一個 bytes 物件) 作為提取加密檔案的預設密碼。

ZipFile.read(name, pwd=None)

返回歸檔檔案中檔案 name 的位元組。name 是歸檔檔案中檔案的名稱,或一個 ZipInfo 物件。歸檔檔案必須以讀取或追加模式開啟。pwd 是用於加密檔案的密碼,以 bytes 物件的形式給出,如果指定,它會覆蓋使用 setpassword() 設定的預設密碼。對使用除 ZIP_STOREDZIP_DEFLATEDZIP_BZIP2ZIP_LZMA 之外的壓縮方法的 ZipFile 呼叫 read() 將引發 NotImplementedError。如果相應的壓縮模組不可用,也會引發錯誤。

在 3.6 版本中更改: 對已關閉的 ZipFile 呼叫 read() 將引發 ValueError。以前,會引發 RuntimeError

ZipFile.testzip()

讀取歸檔檔案中的所有檔案,並檢查它們的 CRC 和檔案頭。返回第一個錯誤檔案的名稱,否則返回 None

在 3.6 版本中更改: 對已關閉的 ZipFile 呼叫 testzip() 將引發 ValueError。以前,會引發 RuntimeError

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

將名為 filename 的檔案寫入歸檔檔案,併為其指定歸檔名稱 arcname (預設情況下,這將與 filename 相同,但沒有驅動器號並刪除前導路徑分隔符)。如果給定,compress_type 將覆蓋為新條目的建構函式提供的 compression 引數值。類似地,如果給定,compresslevel 將覆蓋建構函式。歸檔檔案必須以 'w''x''a' 模式開啟。

註解

ZIP 檔案標準在歷史上沒有指定元資料編碼,但強烈建議使用 CP437(最初的 IBM PC 編碼)來實現互操作性。最新版本允許使用 UTF-8(僅限)。在此模組中,如果成員名稱包含任何非 ASCII 字元,將自動使用 UTF-8 來寫入成員名稱。無法使用 ASCII 或 UTF-8 以外的任何編碼寫入成員名稱。

註解

歸檔名稱應相對於歸檔根目錄,也就是說,它們不應以路徑分隔符開頭。

註解

如果 arcname (或 filename,如果未給出 arcname) 包含空位元組,則歸檔檔案中檔案的名稱將在空位元組處被截斷。

註解

檔名中的前導斜槓可能會導致在 Windows 系統上的某些 zip 程式中無法開啟歸檔檔案。

在 3.6 版本中更改: 對以 'r' 模式建立的 ZipFile 或已關閉的 ZipFile 呼叫 write() 將引發 ValueError。以前,會引發 RuntimeError

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

將檔案寫入歸檔檔案。內容是 data,它可以是一個 strbytes 例項;如果它是一個 str,它會首先被編碼為 UTF-8。zinfo_or_arcname 是它在歸檔檔案中將被給定的檔名,或一個 ZipInfo 例項。如果它是一個例項,則至少必須給出檔名、日期和時間。如果它是一個名稱,則日期和時間將設定為當前日期和時間。歸檔檔案必須以 'w''x''a' 模式開啟。

如果給定,compress_type 將覆蓋為新條目的建構函式或在 zinfo_or_arcname 中給出的 compression 引數值(如果後者是一個 ZipInfo 例項)。類似地,如果給定,compresslevel 將覆蓋建構函式。

註解

當傳遞 ZipInfo 例項作為 zinfo_or_arcname 引數時,所使用的壓縮方法將是給定 ZipInfo 例項的 compress_type 成員中指定的方法。預設情況下,ZipInfo 建構函式會將此成員設定為 ZIP_STORED

在 3.2 版本中變更: compress_type 引數。

在 3.6 版本中變更: 在以模式 'r' 建立的 ZipFile 或已關閉的 ZipFile 上呼叫 writestr() 將引發 ValueError。 之前,會引發 RuntimeError

ZipFile.mkdir(zinfo_or_directory, mode=511)

在壓縮檔案中建立一個目錄。如果 zinfo_or_directory 是一個字串,則會在壓縮檔案中建立一個目錄,其模式由 mode 引數指定。但是,如果 zinfo_or_directory 是一個 ZipInfo 例項,則會忽略 mode 引數。

壓縮檔案必須以模式 'w''x''a' 開啟。

在 3.11 版本中加入。

以下資料屬性也可用

ZipFile.filename

ZIP 檔案的名稱。

ZipFile.debug

要使用的除錯輸出級別。 這可以從 0 (預設值,無輸出) 設定為 3 (最大輸出)。 除錯資訊會寫入到 sys.stdout

ZipFile.comment

與 ZIP 檔案關聯的註釋,以 bytes 物件表示。 如果要向以模式 'w''x''a' 建立的 ZipFile 例項分配註釋,則該註釋的長度不應超過 65535 位元組。 長度超出此限制的註釋將被截斷。

Path 物件

class zipfile.Path(root, at='')

root zip 檔案構造一個 Path 物件 (該 zip 檔案可以是 ZipFile 例項,也可以是適合傳遞給 ZipFile 建構函式的 file)。

at 指定此 Path 在 zip 檔案中的位置,例如 ‘dir/file.txt’、‘dir/’ 或 ''。 預設為空字串,表示根目錄。

Path 物件公開 pathlib.Path 物件的以下功能

可以使用 / 運算子或 joinpath 遍歷 Path 物件。

Path.name

最終路徑元件。

Path.open(mode='r', *, pwd, **)

在當前路徑上呼叫 ZipFile.open()。 允許透過支援的模式:‘r’、‘w’、‘rb’、‘wb’ 以讀取或寫入、文字或二進位制方式開啟。 位置和關鍵字引數將傳遞給 io.TextIOWrapper(當以文字方式開啟時),否則將被忽略。pwdZipFile.open()pwd 引數。

在 3.9 版本中變更: 添加了對 open 的文字和二進位制模式的支援。 預設模式現在是文字。

在 3.11.2 版本中變更: encoding 引數可以作為位置引數提供,而不會導致 TypeError。 就像在 3.9 中一樣。 需要與未修補的 3.10 和 3.11 版本相容的程式碼必須將所有 io.TextIOWrapper 引數(包括 encoding)作為關鍵字傳遞。

Path.iterdir()

列舉當前目錄的子項。

Path.is_dir()

如果當前上下文引用目錄,則返回 True

Path.is_file()

如果當前上下文引用檔案,則返回 True

如果當前上下文引用符號連結,則返回 True

在 3.12 版本中加入。

在 3.13 版本中變更: 之前,is_symlink 會無條件返回 False

Path.exists()

如果當前上下文引用 zip 檔案中的檔案或目錄,則返回 True

Path.suffix

最後一個元件中最後一個以點分隔的部分(如果有)。 這通常稱為副檔名。

在 3.11 版本中加入: 添加了 Path.suffix 屬性。

Path.stem

最終路徑元件,不帶其後綴。

在 3.11 版本中加入: 添加了 Path.stem 屬性。

Path.suffixes

路徑的字尾列表,通常稱為副檔名。

在 3.11 版本中加入: 添加了 Path.suffixes 屬性。

Path.read_text(*, **)

將當前檔案讀取為 Unicode 文字。 位置和關鍵字引數將傳遞給 io.TextIOWrapper(除了 buffer,它由上下文暗示)。

在 3.11.2 版本中變更: encoding 引數可以作為位置引數提供,而不會導致 TypeError。 就像在 3.9 中一樣。 需要與未修補的 3.10 和 3.11 版本相容的程式碼必須將所有 io.TextIOWrapper 引數(包括 encoding)作為關鍵字傳遞。

Path.read_bytes()

以位元組形式讀取當前檔案。

Path.joinpath(*other)

返回一個新的 Path 物件,其中每個 other 引數都被連線起來。以下是等效的:

>>> Path(...).joinpath('child').joinpath('grandchild')
>>> Path(...).joinpath('child', 'grandchild')
>>> Path(...) / 'child' / 'grandchild'

在 3.10 版本中變更: 在 3.10 之前, joinpath 是未記錄的,並且只接受一個引數。

zipp 專案為較舊的 Python 版本提供了最新路徑物件功能的向後移植。使用 zipp.Path 代替 zipfile.Path 可以提前體驗這些更改。

PyZipFile 物件

PyZipFile 建構函式接受與 ZipFile 建構函式相同的引數,以及一個額外的引數 optimize

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

在 3.2 版本中變更: 添加了 optimize 引數。

在 3.4 版本中更改: 預設啟用 ZIP64 擴充套件。

例項除了 ZipFile 物件的方法外,還具有一個方法

writepy(pathname, basename='', filterfunc=None)

搜尋檔案 *.py 並將相應的檔案新增到存檔中。

如果 PyZipFileoptimize 引數未給定或為 -1,則相應的檔案是一個 *.pyc 檔案,必要時會進行編譯。

如果 PyZipFileoptimize 引數為 012,則只有具有該最佳化級別的檔案(請參閱 compile())會被新增到存檔中,必要時會進行編譯。

如果 pathname 是一個檔案,則檔名必須以 .py 結尾,並且只在頂層新增(相應的 *.pyc)檔案(不含路徑資訊)。如果 pathname 是一個不以 .py 結尾的檔案,則會引發 RuntimeError。如果它是一個目錄,並且該目錄不是包目錄,則所有 *.pyc 檔案都會在頂層新增。如果該目錄是一個包目錄,則所有 *.pyc 檔案都將作為檔案路徑在包名稱下新增,並且如果任何子目錄是包目錄,則所有這些都將以排序的順序遞迴新增。

basename 僅供內部使用。

filterfunc 如果給定,必須是一個接受單個字串引數的函式。在將其新增到存檔之前,會將每個路徑(包括每個單獨的完整檔案路徑)傳遞給它。如果 filterfunc 返回一個假值,則不會新增該路徑,並且如果它是一個目錄,則會忽略其內容。例如,如果我們的測試檔案都位於 test 目錄中或以字串 test_ 開頭,則可以使用 filterfunc 將它們排除在外

>>> zf = PyZipFile('myprog.zip')
>>> def notests(s):
...     fn = os.path.basename(s)
...     return (not (fn == 'test' or fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notests)

writepy() 方法建立具有如下檔名的存檔

string.pyc                   # Top level name
test/__init__.pyc            # Package directory
test/testall.pyc             # Module test.testall
test/bogus/__init__.pyc      # Subpackage directory
test/bogus/myfile.pyc        # Submodule test.bogus.myfile

在 3.4 版本中變更: 添加了 filterfunc 引數。

在 3.6.2 版本中變更: pathname 引數接受 路徑型物件

在 3.7 版本中變更: 遞迴會對目錄條目進行排序。

ZipInfo 物件

ZipInfo 類的例項由 getinfo()infolist() 方法返回 ZipFile 物件。每個物件都儲存有關 ZIP 存檔的單個成員的資訊。

有一個類方法可以為檔案系統檔案建立一個 ZipInfo 例項

classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)

在準備將其新增到 zip 檔案時,為檔案系統上的檔案構造一個 ZipInfo 例項。

filename 應該是檔案系統上檔案或目錄的路徑。

如果指定了 arcname,則將其用作存檔中的名稱。如果未指定 arcname,則該名稱將與 filename 相同,但會刪除任何驅動器號和前導路徑分隔符。

strict_timestamps 引數設定為 False 時,允許壓縮早於 1980-01-01 的檔案,但代價是將時間戳設定為 1980-01-01。 對於晚於 2107-12-31 的檔案,也會出現類似的行為,時間戳也會設定為該限制值。

在 3.6 版本中新增。

在 3.6.2 版本中變更: filename 引數接受 路徑型物件

在 3.8 版本中變更: 添加了 strict_timestamps 僅限關鍵字引數。

例項具有以下方法和屬性

ZipInfo.is_dir()

如果此存檔成員是目錄,則返回 True

這使用條目的名稱:目錄應始終以 / 結尾。

在 3.6 版本中新增。

ZipInfo.filename

存檔中檔案的名稱。

ZipInfo.date_time

存檔成員上次修改的時間和日期。這是一個包含六個值的元組

索引

0

年份(>= 1980)

1

月份(從一開始)

2

月份中的日期(從一開始)

3

小時(從零開始)

4

分鐘(從零開始)

5

秒(從零開始)

註解

ZIP 檔案格式不支援 1980 年之前的 時間戳。

ZipInfo.compress_type

存檔成員的壓縮型別。

ZipInfo.comment

單個存檔成員的註釋,作為 bytes 物件。

ZipInfo.extra

擴充套件欄位資料。 PKZIP 應用程式註釋包含有關此 bytes 物件中包含的資料的內部結構的一些註釋。

ZipInfo.create_system

建立 ZIP 存檔的系統。

ZipInfo.create_version

建立 ZIP 存檔的 PKZIP 版本。

ZipInfo.extract_version

提取歸檔所需的 PKZIP 版本。

ZipInfo.reserved

必須為零。

ZipInfo.flag_bits

ZIP 標誌位。

ZipInfo.volume

檔案頭的卷號。

ZipInfo.internal_attr

內部屬性。

ZipInfo.external_attr

外部檔案屬性。

ZipInfo.header_offset

檔案頭的位元組偏移量。

ZipInfo.CRC

未壓縮檔案的 CRC-32 值。

ZipInfo.compress_size

壓縮資料的大小。

ZipInfo.file_size

未壓縮檔案的大小。

命令列介面

zipfile 模組提供了一個簡單的命令列介面,用於與 ZIP 歸檔檔案進行互動。

如果要建立一個新的 ZIP 歸檔檔案,請在 -c 選項後指定其名稱,然後列出應包含的檔名。

$ python -m zipfile -c monty.zip spam.txt eggs.txt

也可以傳遞一個目錄。

$ python -m zipfile -c monty.zip life-of-brian_1979/

如果要將 ZIP 歸檔檔案解壓到指定的目錄中,請使用 -e 選項。

$ python -m zipfile -e monty.zip target-dir/

要列出 ZIP 歸檔檔案中的檔案,請使用 -l 選項。

$ python -m zipfile -l monty.zip

命令列選項

-l <zipfile>
--list <zipfile>

列出 zip 檔案中的檔案。

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

從原始檔建立 zip 檔案。

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

將 zip 檔案解壓到目標目錄。

-t <zipfile>
--test <zipfile>

測試 zip 檔案是否有效。

--metadata-encoding <encoding>

指定 -l-e-t 的成員名稱的編碼。

在 3.11 版本中加入。

解壓縮的陷阱

由於以下列出的某些陷阱,zipfile 模組中的提取可能會失敗。

來自檔案本身

由於密碼/CRC 校驗和/ZIP 格式不正確或不支援的壓縮方法/解密,解壓縮可能會失敗。

檔案系統限制

超出不同檔案系統的限制會導致解壓縮失敗。例如,目錄條目中允許的字元、檔名的長度、路徑名的長度、單個檔案的大小以及檔案數量等。

資源限制

記憶體或磁碟空間不足會導致解壓縮失敗。例如,解壓縮炸彈(也稱為 ZIP 炸彈)適用於 zipfile 庫,這可能會導致磁碟空間耗盡。

中斷

解壓縮期間的中斷,例如按下 Control-C 或終止解壓縮排程,可能會導致歸檔檔案解壓縮不完整。

提取的預設行為

不瞭解預設提取行為可能會導致意外的解壓縮結果。例如,當兩次提取同一個歸檔檔案時,它會在不詢問的情況下覆蓋檔案。