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
,否則返回False
。filename 也可以是檔案或類檔案物件。在 3.1 版本中更改: 支援檔案和類檔案物件。
- zipfile.ZIP_STORED¶
未壓縮的存檔成員的數字常量。
- 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_STORED
、ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_LZMA
;無法識別的值將導致引發NotImplementedError
。 如果指定了ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_LZMA
,但相應的模組(zlib
、bz2
或lzma
)不可用,則會引發RuntimeError
。 預設值為ZIP_STORED
。如果 allowZip64 為
True
(預設值),則當 zip 檔案大於 4 GiB 時,zipfile 將建立使用 ZIP64 副檔名的 ZIP 檔案。如果為false
,則當 ZIP 檔案需要 ZIP64 副檔名時,zipfile
將引發異常。compresslevel 引數控制將檔案寫入存檔時使用的壓縮級別。當使用
ZIP_STORED
或ZIP_LZMA
時,它不起作用。當使用ZIP_DEFLATED
時,接受整數0
到9
(有關詳細資訊,請參見zlib
)。當使用ZIP_BZIP2
時,接受整數1
到9
(有關詳細資訊,請參見bz2
)。當 strict_timestamps 引數設定為
False
時,允許壓縮早於 1980-01-01 的檔案,但代價是將時間戳設定為 1980-01-01。 對於晚於 2107-12-31 的檔案,也會出現類似的行為,時間戳也會設定為該限制值。當模式為
'r'
時,可以將 metadata_encoding 設定為編解碼器的名稱,該名稱將用於解碼成員名稱和 ZIP 註釋等元資料。如果檔案是以模式
'w'
、'x'
或'a'
建立,然後在未向存檔新增任何檔案的情況下closed
,則會將空存檔的相應 ZIP 結構寫入該檔案。ZipFile 也是一個上下文管理器,因此支援
with
語句。在示例中,myzip 在with
語句的套件完成後關閉,即使發生異常也是如此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.4 版本中更改: 預設啟用 ZIP64 擴充套件。
在 3.5 版本中更改: 增加了對寫入不可查詢的流的支援。增加了對
'x'
模式的支援。在 3.6 版本中更改: 以前,對於無法識別的壓縮值,會引發一個簡單的
RuntimeError
。在 3.6.2 版本中更改: file 引數接受 路徑類物件。
在 3.7 版本中更改: 添加了 compresslevel 引數。
在 3.8 版本中更改: strict_timestamps 僅關鍵字引數。
在 3.11 版本中更改: 增加了對指定 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_size
的ZipInfo
物件,並將其用作 name 引數。在 3.6 版本中更改: 刪除了對
mode='U'
的支援。對於以 通用換行符 模式讀取壓縮文字檔案,請使用io.TextIOWrapper
。在 3.6 版本中更改:
ZipFile.open()
現在可以使用mode='w'
選項將檔案寫入歸檔檔案。在 3.6 版本中更改: 在已關閉的 ZipFile 上呼叫
open()
將引發ValueError
。以前,會引發RuntimeError
。在 3.13 版本中更改: 為可寫類檔案物件添加了屬性
name
和mode
。可讀類檔案物件的mode
屬性的值從'r'
更改為'rb'
。
- ZipFile.extract(member, path=None, pwd=None)¶
從歸檔檔案中提取一個成員到當前工作目錄;member 必須是其完整名稱或一個
ZipInfo
物件。其檔案資訊將盡可能準確地提取。path 指定要提取到的其他目錄。member 可以是檔名或ZipInfo
物件。pwd 是用於加密檔案的密碼,型別為bytes
物件。返回建立的規範化路徑(目錄或新檔案)。
註解
如果成員檔名是絕對路徑,則會剝離驅動器/UNC 共享點和前導(反)斜槓,例如:
///foo/bar
在 Unix 上變為foo/bar
,C:\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.read(name, pwd=None)¶
返回歸檔檔案中檔案 name 的位元組。name 是歸檔檔案中檔案的名稱,或一個
ZipInfo
物件。歸檔檔案必須以讀取或追加模式開啟。pwd 是用於加密檔案的密碼,以bytes
物件的形式給出,如果指定,它會覆蓋使用setpassword()
設定的預設密碼。對使用除ZIP_STORED
、ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_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,它可以是一個
str
或bytes
例項;如果它是一個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
。
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
(當以文字方式開啟時),否則將被忽略。pwd
是ZipFile.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
。
- Path.is_symlink()¶
如果當前上下文引用符號連結,則返回
True
。在 3.12 版本中加入。
在 3.13 版本中變更: 之前,
is_symlink
會無條件返回False
。
- Path.exists()¶
如果當前上下文引用 zip 檔案中的檔案或目錄,則返回
True
。
- Path.suffix¶
最後一個元件中最後一個以點分隔的部分(如果有)。 這通常稱為副檔名。
在 3.11 版本中加入: 添加了
Path.suffix
屬性。
- 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
並將相應的檔案新增到存檔中。如果
PyZipFile
的 optimize 引數未給定或為-1
,則相應的檔案是一個*.pyc
檔案,必要時會進行編譯。如果
PyZipFile
的 optimize 引數為0
、1
或2
,則只有具有該最佳化級別的檔案(請參閱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.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
命令列選項¶
解壓縮的陷阱¶
由於以下列出的某些陷阱,zipfile 模組中的提取可能會失敗。
來自檔案本身¶
由於密碼/CRC 校驗和/ZIP 格式不正確或不支援的壓縮方法/解密,解壓縮可能會失敗。
檔案系統限制¶
超出不同檔案系統的限制會導致解壓縮失敗。例如,目錄條目中允許的字元、檔名的長度、路徑名的長度、單個檔案的大小以及檔案數量等。
資源限制¶
記憶體或磁碟空間不足會導致解壓縮失敗。例如,解壓縮炸彈(也稱為 ZIP 炸彈)適用於 zipfile 庫,這可能會導致磁碟空間耗盡。
中斷¶
解壓縮期間的中斷,例如按下 Control-C 或終止解壓縮排程,可能會導致歸檔檔案解壓縮不完整。
提取的預設行為¶
不瞭解預設提取行為可能會導致意外的解壓縮結果。例如,當兩次提取同一個歸檔檔案時,它會在不詢問的情況下覆蓋檔案。