zipfile --- 使用ZIP存檔?

源代碼: Lib/zipfile.py


ZIP 文件格式是一個(gè)常用的歸檔與壓縮標準。 這個(gè)模塊提供了創(chuàng )建、讀取、寫(xiě)入、添加及列出 ZIP 文件的工具。 任何對此模塊的進(jìn)階使用都將需要理解此格式,其定義參見(jiàn) PKZIP 應用程序筆記。

此模塊目前不能處理分卷 ZIP 文件。它可以處理使用 ZIP64 擴展(超過(guò) 4 GB 的 ZIP 文件)的 ZIP 文件。它支持解密 ZIP 歸檔中的加密文件,但是目前不能創(chuàng )建一個(gè)加密的文件。解密非常慢,因為它是使用原生 Python 而不是 C 實(shí)現的。

這個(gè)模塊定義了以下內容:

exception zipfile.BadZipFile?

為損壞的 ZIP 文件拋出的錯誤。

3.2 新版功能.

exception zipfile.BadZipfile?

BadZipFile 的別名,與舊版本 Python 保持兼容性。

3.2 版后已移除.

exception zipfile.LargeZipFile?

當 ZIP 文件需要 ZIP64 功能但是未啟用時(shí)會(huì )拋出此錯誤。

class zipfile.ZipFile

用于讀寫(xiě) ZIP 文件的類(lèi)。 欲了解構造函數的描述,參閱段落 ZipFile 對象。

class zipfile.Path

用于 zip 文件的兼容 pathlib 的包裝器。 詳情參見(jiàn) Path 對象。

3.8 新版功能.

class zipfile.PyZipFile

用于創(chuàng )建包含 Python 庫的 ZIP 歸檔的類(lèi)。

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

用于表示檔案內一個(gè)成員信息的類(lèi)。 此類(lèi)的實(shí)例會(huì )由 ZipFile 對象的 getinfo()infolist() 方法返回。 大多數 zipfile 模塊的用戶(hù)都不必創(chuàng )建它們,只需使用此模塊所創(chuàng )建的實(shí)例。 filename 應當是檔案成員的全名,date_time 應當是包含六個(gè)字段的描述最近修改時(shí)間的元組;這些字段的描述請參閱 ZipInfo 對象。

zipfile.is_zipfile(filename)?

根據文件的 Magic Number,如果 filename 是一個(gè)有效的 ZIP 文件則返回 True,否則返回 False。 filename 也可能是一個(gè)文件或類(lèi)文件對象。

在 3.1 版更改: 支持文件或類(lèi)文件對象。

zipfile.ZIP_STORED?

未被壓縮的歸檔成員的數字常數。

zipfile.ZIP_DEFLATED?

常用的 ZIP 壓縮方法的數字常數。需要 zlib 模塊。

zipfile.ZIP_BZIP2?

BZIP2 壓縮方法的數字常數。需要 bz2 模塊。

3.3 新版功能.

zipfile.ZIP_LZMA?

LZMA 壓縮方法的數字常數。需要 lzma 模塊。

3.3 新版功能.

備注

ZIP 文件格式規范包括自 2001 年以來(lái)對 bzip2 壓縮的支持,以及自 2006 年以來(lái)對 LZMA 壓縮的支持。但是,一些工具(包括較舊的 Python 版本)不支持這些壓縮方法,并且可能拒絕完全處理 ZIP 文件,或者無(wú)法提取單個(gè)文件。

參見(jiàn)

PKZIP 應用程序筆記

Phil Katz 編寫(xiě)的 ZIP 文件格式文檔,此格式和使用的算法的創(chuàng )建者。

Info-ZIP 主頁(yè)

有關(guān) Info-ZIP 項目的 ZIP 存檔程序和開(kāi)發(fā)庫的信息。

ZipFile 對象?

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

打開(kāi)一個(gè) ZIP 文件,file 為一個(gè)指向文件的路徑(字符串),一個(gè)類(lèi)文件對象或者一個(gè) path-like object。

形參 mode 應當為 'r' 來(lái)讀取一個(gè)存在的文件,'w' 來(lái)截斷并寫(xiě)入新的文件, 'a' 來(lái)添加到一個(gè)存在的文件,或者 'x' 來(lái)僅新建并寫(xiě)入新的文件。如果 mode'x' 并且 file 指向已經(jīng)存在的文件,則拋出 FileExistsError。如果 mode'a'file 為已存在的文件,則格外的文件將被加入。如果 file 不指向 ZIP 文件,之后一個(gè)新的 ZIP 歸檔將被追加為此文件。這是為了將 ZIP 歸檔添加到另一個(gè)文件(例如 python.exe)。如果 mode'a' 并且文件不存在, 則會(huì )新建。如果 mode'r''a', 則文件應當可定位。

compression 是在寫(xiě)入歸檔時(shí)要使用的 ZIP 壓縮方法,應為 ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2ZIP_LZMA;不可識別的值將導致引發(fā) NotImplementedError。 如果指定了 ZIP_DEFLATED, ZIP_BZIP2ZIP_LZMA 但相應的模塊 (zlib, bz2lzma) 不可用,則會(huì )引發(fā) RuntimeError。 默認值為 ZIP_STORED。

如果 allowZip64True (默認值) 則當 zipfile 大于 4 GiB 時(shí) zipfile 將創(chuàng )建使用 ZIP64 擴展的 ZIP 文件。 如果該參數為 false 則當 ZIP 文件需要 ZIP64 擴展時(shí) zipfile 將引發(fā)異常。

compresslevel 形參控制在將文件寫(xiě)入歸檔時(shí)要使用的壓縮等級。 當使用 ZIP_STOREDZIP_LZMA 時(shí)無(wú)壓縮效果。 當使用 ZIP_DEFLATED 時(shí)接受整數 09 (更多信息參見(jiàn) zlib)。 當使用 ZIP_BZIP2 時(shí)接受整數 19 (更多信息參見(jiàn) bz2)。

strict_timestamps 參數在設為 False 時(shí)允許壓縮早于 1980-01-01 的文件,代價(jià)時(shí)會(huì )將時(shí)間戳設為 1980-01-01。 類(lèi)似的行為也會(huì )對晚于 2107-12-31 的文件發(fā)生,時(shí)間戳也會(huì )被設為該上限值。

When mode is 'r', metadata_encoding may be set to the name of a codec, which will be used to decode metadata such as the names of members and ZIP comments.

如果創(chuàng )建文件時(shí)使用 'w', 'x''a' 模式并且未向歸檔添加任何文件就執行了 closed,則會(huì )將適當的空歸檔 ZIP 結構寫(xiě)入文件。

ZipFile 也是一個(gè)上下文管理器,因此支持 with 語(yǔ)句。 在這個(gè)示例中,myzip 將在 with 語(yǔ)句塊執行完成之后被關(guān)閉 --- 即使是發(fā)生了異常:

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

備注

metadata_encoding is an instance-wide setting for the ZipFile. It is not currently possible to set this on a per-member basis.

This attribute is a workaround for legacy implementations which produce archives with names in the current locale encoding or code page (mostly on Windows). According to the .ZIP standard, the encoding of metadata may be specified to be either IBM code page (default) or UTF-8 by a flag in the archive header. That flag takes precedence over metadata_encoding, which is a Python-specific extension.

3.2 新版功能: 添加了將 ZipFile 用作上下文管理器的功能。

在 3.3 版更改: 添加了對 bzip2lzma 壓縮的支持。

在 3.4 版更改: 默認啟用 ZIP64 擴展。

在 3.5 版更改: 添加了對不可查找數據流的支持。 并添加了對 'x' 模式的支持。

在 3.6 版更改: 在此之前,對于不可識別的壓縮值將引發(fā)普通的 RuntimeError。

在 3.6.2 版更改: file 形參接受一個(gè) path-like object。

在 3.7 版更改: 添加了 compresslevel 形參。

3.8 新版功能: strict_timestamps 僅限關(guān)鍵字參數

在 3.11 版更改: Added support for specifying member name encoding for reading metadata in the zipfile's directory and file headers.

ZipFile.close()?

關(guān)閉歸檔文件。 你必須在退出程序之前調用 close() 否則將不會(huì )寫(xiě)入關(guān)鍵記錄數據。

ZipFile.getinfo(name)?

返回一個(gè) ZipInfo 對象,其中包含有關(guān)歸檔成員 name 的信息。 針對一個(gè)目前并不包含于歸檔中的名稱(chēng)調用 getinfo() 將會(huì )引發(fā) KeyError。

ZipFile.infolist()?

返回一個(gè)列表,其中包含每個(gè)歸檔成員的 ZipInfo 對象。 如果是打開(kāi)一個(gè)現有歸檔則這些對象的排列順序與它們對應條目在磁盤(pán)上的實(shí)際 ZIP 文件中的順序一致。

ZipFile.namelist()?

返回按名稱(chēng)排序的歸檔成員列表。

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

以二進(jìn)制文件類(lèi)對象的形式訪(fǎng)問(wèn)一個(gè)歸檔成員。 name 可以是歸檔內某個(gè)文件的名稱(chēng)也可以是某個(gè) ZipInfo 對象。 如果包含了 mode 形參,則它必須為 'r' (默認值) 或 'w'。 pwd 為用于解密已加密 ZIP 文件的密碼。

open() 也是一個(gè)上下文管理器,因此支持 with 語(yǔ)句:

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

如果 mode'r' 則文件類(lèi)對象 (ZipExtFile) 將為只讀并且提供下列方法: read(), readline(), readlines(), seek(), tell(), __iter__(), __next__()。 這些對象可獨立于 ZipFile 進(jìn)行操作。

如果 mode='w' 則返回一個(gè)可寫(xiě)入的文件句柄,它將支持 write() 方法。 當一個(gè)可寫(xiě)入的文件句柄被打開(kāi)時(shí),嘗試讀寫(xiě) ZIP 文件中的其他文件將會(huì )引發(fā) ValueError。

當寫(xiě)入一個(gè)文件時(shí),如果文件大小不能預先確定但是可能超過(guò) 2 GiB,可傳入 force_zip64=True 以確保標頭格式能夠支持超大文件。 如果文件大小可以預先確定,則在構造 ZipInfo 對象時(shí)應設置 file_size,并將其用作 name 形參。

備注

open(), read()extract() 方法可接受文件名或 ZipInfo 對象。 當嘗試讀取一個(gè)包含重復名稱(chēng)成員的 ZIP 文件時(shí)你將發(fā)現此功能很有好處。

在 3.6 版更改: 移除了對 mode='U' 的支持。 請使用 io.TextIOWrapper 以在 universal newlines 模式中讀取已壓縮的文本文件。

在 3.6 版更改: ZipFile.open() can now be used to write files into the archive with the mode='w' option.

在 3.6 版更改: 在已關(guān)閉的 ZipFile 上調用 open() 將引發(fā) ValueError。 在之前的版本中則會(huì )引發(fā) RuntimeError。

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

從歸檔中提取出一個(gè)成員放入當前工作目錄;member 必須為成員的完整名稱(chēng)或 ZipInfo 對象。 成員的文件信息會(huì )盡可能精確地被提取。 path 指定一個(gè)要提取到的不同目錄。 member 可以是一個(gè)文件名或 ZipInfo 對象。 pwd 是用于解密文件的密碼。

返回所創(chuàng )建的經(jīng)正規化的路徑(對應于目錄或新文件)。

備注

如果一個(gè)成員文件名為絕對路徑,則將去掉驅動(dòng)器/UNC共享點(diǎn)和前導的(反)斜杠,例如: ///foo/bar 在 Unix 上將變?yōu)?foo/bar,而 C:\foo\bar 在 Windows 上將變?yōu)?foo\bar。 并且一個(gè)成員文件名中的所有 ".." 都將被移除,例如: ../../foo../../ba..r 將變?yōu)?foo../ba..r。 在 Windows 上非法字符 (:, <, >, |, ", ?, and *) 會(huì )被替換為下劃線(xiàn) (_)。

在 3.6 版更改: 在已關(guān)閉的 ZipFile 上調用 extract() 將引發(fā) ValueError。 在之前的版本中則將引發(fā) RuntimeError。

在 3.6.2 版更改: path 形參接受一個(gè) path-like object。

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

從歸檔中提取出所有成員放入當前工作目錄。 path 指定一個(gè)要提取到的不同目錄。 members 為可選項且必須為 namelist() 所返回列表的一個(gè)子集。 pwd 是用于解密文件的密碼。

警告

絕不要未經(jīng)預先檢驗就從不可靠的源中提取歸檔文件。 這樣有可能在 path 之外創(chuàng )建文件,例如某些成員具有以 "/" 開(kāi)始的文件名或帶有兩個(gè)點(diǎn)號 ".." 的文件名。 此模塊會(huì )嘗試防止這種情況。 參見(jiàn) extract() 的注釋。

在 3.6 版更改: 在已關(guān)閉的 ZipFile 上調用 extractall() 將引發(fā) ValueError。 在之前的版本中則將引發(fā) RuntimeError。

在 3.6.2 版更改: path 形參接受一個(gè) path-like object。

ZipFile.printdir()?

將歸檔的目錄表打印到 sys.stdout。

ZipFile.setpassword(pwd)?

設置 pwd 為用于提取已加密文件的默認密碼。

ZipFile.read(name, pwd=None)?

返回歸檔中文件 name 的字節數據。 name 是歸檔中文件的名稱(chēng),或是一個(gè) ZipInfo 對象。 歸檔必須以讀取或追加方式打開(kāi)。 pwd 為用于已加密文件的密碼,并且如果指定該參數則它將覆蓋通過(guò) setpassword() 設置的默認密碼。 on a ZipFile that uses a compression method 在使用 ZIP_STORED , ZIP_DEFLATED, ZIP_BZIP2ZIP_LZMA 以外的壓縮方法的 ZipFile 上調用 read() 將引發(fā) NotImplementedError。 如果相應的壓縮模塊不可用也會(huì )引發(fā)錯誤。

在 3.6 版更改: 在已關(guān)閉的 ZipFile 上調用 read() 將引發(fā) ValueError。 在之前的版本中則會(huì )引發(fā) RuntimeError。

ZipFile.testzip()?

讀取歸檔中的所有文件并檢查它們的 CRC 和文件頭。 返回第一個(gè)已損壞文件的名稱(chēng),在其他情況下則返回 None。

在 3.6 版更改: 在已關(guān)閉的 ZipFile 上調用 testzip() 將引發(fā) ValueError。 在之前的版本中則將引發(fā) RuntimeError。

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

將名為 filename 的文件寫(xiě)入歸檔,給予的歸檔名為 arcname (默認情況下將與 filename 一致,但是不帶驅動(dòng)器盤(pán)符并會(huì )移除開(kāi)頭的路徑分隔符)。 compress_type 如果給出,它將覆蓋作為構造器 compression 形參對于新條目所給出的值。 類(lèi)似地,compresslevel 如果給出也將覆蓋構造器。 歸檔必須使用 'w', 'x''a' 模式打開(kāi)。

備注

The ZIP file standard historically did not specify a metadata encoding, but strongly recommended CP437 (the original IBM PC encoding) for interoperability. Recent versions allow use of UTF-8 (only). In this module, UTF-8 will automatically be used to write the member names if they contain any non-ASCII characters. It is not possible to write member names in any encoding other than ASCII or UTF-8.

備注

歸檔名稱(chēng)應當是基于歸檔根目錄的相對路徑,也就是說(shuō),它們不應以路徑分隔符開(kāi)頭。

備注

如果 arcname (或 filename,如果 arcname 未給出) 包含一個(gè)空字節,則歸檔中該文件的名稱(chēng)將在空字節位置被截斷。

備注

文件名開(kāi)頭有一個(gè)斜杠可能導致存檔文件無(wú)法在 Windows 系統上的某些 zip 程序中打開(kāi)。

在 3.6 版更改: 在使用 'r' 模式創(chuàng )建的 ZipFile 或已關(guān)閉的 ZipFile 上調用 write() 將引發(fā) ValueError。 在之前的版本中則會(huì )引發(fā) RuntimeError。

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

將一個(gè)文件寫(xiě)入歸檔。 內容為 data,它可以是一個(gè) strbytes 的實(shí)例;如果是 str,則會(huì )先使用 UTF-8 進(jìn)行編碼。 zinfo_or_arcname 可以是它在歸檔中將被給予的名稱(chēng),或者是 ZipInfo 的實(shí)例。 如果它是一個(gè)實(shí)例,則至少必須給定文件名、日期和時(shí)間。 如果它是一個(gè)名稱(chēng),則日期和時(shí)間會(huì )被設為當前日期和時(shí)間。 歸檔必須以 'w', 'x''a' 模式打開(kāi)。

如果給定了 compress_type,它將會(huì )覆蓋作為新條目構造器的 compression 形參或在 zinfo_or_arcname (如果是一個(gè) ZipInfo 實(shí)例) 中所給出的值。 類(lèi)似地,如果給定了 compresslevel,它將會(huì )覆蓋構造器。

備注

當傳入一個(gè) ZipInfo 實(shí)例作為 zinfo_or_arcname 形參時(shí),所使用的壓縮方法將為在給定的 ZipInfo 實(shí)例的 compress_type 成員中指定的方法。 默認情況下,ZipInfo 構造器將將此成員設為 ZIP_STORED。

在 3.2 版更改: compress_type 參數。

在 3.6 版更改: 在使用 'r' 模式創(chuàng )建的 ZipFile 或已關(guān)閉的 ZipFile 上調用 writestr() 將引發(fā) ValueError。 在之前的版本中則會(huì )引發(fā) RuntimeError。

ZipFile.mkdir(zinfo_or_directory, mode=511)?

Create a directory inside the archive. If zinfo_or_directory is a string, a directory is created inside the archive with the mode that is specified in the mode argument. If, however, zinfo_or_directory is a ZipInfo instance then the mode argument is ignored.

The archive must be opened with mode 'w', 'x' or 'a'.

3.11 新版功能.

以下數據屬性也是可用的:

ZipFile.filename?

ZIP 文件的名稱(chēng)。

ZipFile.debug?

要使用的調試輸出等級。 這可以設為從 0 (默認無(wú)輸出) 到 3 (最多輸出) 的值。 調試信息會(huì )被寫(xiě)入 sys.stdout。

ZipFile.comment?

關(guān)聯(lián)到 ZIP 文件的 bytes 對象形式的說(shuō)明。 如果將說(shuō)明賦給以 'w', 'x''a' 模式創(chuàng )建的 ZipFile 實(shí)例,它的長(cháng)度不應超過(guò) 65535 字節。 超過(guò)此長(cháng)度的說(shuō)明將被截斷。

Path 對象?

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

根據 root zipfile (它可以是一個(gè) ZipFile 實(shí)例或適合傳給 ZipFile 構造器的 file) 構造一個(gè) Path 對象。

at 指定此 Path 在 zipfile 中的位置,例如 'dir/file.txt', 'dir/' 或 ''。 默認為空字符串,即指定跟目錄。

Path 對象會(huì )公開(kāi) pathlib.Path 對象的下列特性:

Path 對象可以使用 / 運算符或 joinpath 來(lái)進(jìn)行遍歷。

Path.name?

最終的路徑組成部分。

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

在當前路徑上發(fā)起調用 ZipFile.open()。 允許通過(guò)支持的模式打開(kāi)用于讀取或寫(xiě)入文本或二進(jìn)制數據: 'r', 'w', 'rb', 'wb'。 當以文本模式打開(kāi)時(shí)位置和關(guān)鍵字參數會(huì )被傳給 io.TextIOWrapper,在其他情況下則會(huì )被忽略。 pwd 是要傳給 ZipFile.open()pwd 形參。

在 3.9 版更改: 增加了對以文本和二進(jìn)制模式打開(kāi)的支持。 現在默認為文本模式。

Path.iterdir()?

枚舉當前目錄的子目錄。

Path.is_dir()?

如果當前上下文引用了一個(gè)目錄則返回 True。

Path.is_file()?

如果當前上下文引用了一個(gè)文件則返回 True。

Path.exists()?

如果當前上下文引用了 zip 文件內的一個(gè)文件或目錄則返回 True。

Path.suffix?

The file extension of the final component.

3.11 新版功能: Added Path.suffix property.

Path.stem?

The final path component, without its suffix.

3.11 新版功能: Added Path.stem property.

Path.suffixes?

A list of the path’s file extensions.

3.11 新版功能: Added Path.suffixes property.

Path.read_text(*, **)?

讀取當前文件為 unicode 文本。 位置和關(guān)鍵字參數會(huì )被傳遞給 io.TextIOWrapper (buffer 除外,它將由上下文確定)。

Path.read_bytes()?

讀取當前文件為字節串。

Path.joinpath(*other)?

返回一個(gè)新的 Path 對象,其中合并了每個(gè) other 參數。 以下代碼是等價(jià)的:

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

在 3.10 版更改: 在 3.10 之前,joinpath 未被寫(xiě)入文檔并且只接受一個(gè)形參。

The zipp project provides backports of the latest path object functionality to older Pythons. Use zipp.Path in place of zipfile.Path for early access to changes.

PyZipFile 對象?

PyZipFile 構造器接受與 ZipFile 構造器相同的形參,以及一個(gè)額外的形參 optimize。

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

3.2 新版功能: optimize 形參。

在 3.4 版更改: 默認啟用 ZIP64 擴展。

實(shí)例在 ZipFile 對象所具有的方法以外還附加了一個(gè)方法:

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

查找 *.py 文件并將相應的文件添加到歸檔。

如果 PyZipFileoptimize 形參未給定或為 -1,則相應的文件為 *.pyc 文件,并在必要時(shí)進(jìn)行編譯。

如果 PyZipFileoptimize 形參為 0, 12,則限具有相應優(yōu)化級別 (參見(jiàn) compile()) 的文件會(huì )被添加到歸檔,并在必要時(shí)進(jìn)行編譯。

如果 pathname 是文件,則文件名必須以 .py 為后綴,并且只有 (相應的 *.pyc) 文件會(huì )被添加到最高層級(不帶路徑信息)。 如果 pathname 不是以 .py 為后綴的文件,則將引發(fā) RuntimeError。 如果它是目錄,并且該目錄不是一個(gè)包目錄,則所有的 *.pyc 文件會(huì )被添加到最高層級。 如果目錄是一個(gè)包目錄,則所有的 *.pyc 會(huì )被添加到包名所表示的文件路徑下,并且如果有任何子目錄為包目錄,則會(huì )以排好的順序遞歸地添加這些目錄。

basename 僅限在內部使用。

如果給定 filterfunc,則它必須是一個(gè)接受單個(gè)字符串參數的函數。 在將其添加到歸檔之前它將被傳入每個(gè)路徑(包括每個(gè)單獨的完整路徑)。 如果 filterfunc 返回假值,則路徑將不會(huì )被添加,而如果它是一個(gè)目錄則其內容將被忽略。 例如,如果我們的測試文件全都位于 test 目錄或以字符串 test_ 打頭,則我們可以使用一個(gè) filterfunc 來(lái)排除它們:

>>>
>>> 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() 方法會(huì )產(chǎn)生帶有這樣一些文件名的歸檔:

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 形參接受一個(gè) path-like object。

在 3.7 版更改: 遞歸排序目錄條目。

ZipInfo 對象?

ZipInfo 類(lèi)的實(shí)例會(huì )通過(guò) getinfo()ZipFile 對象的 infolist() 方法返回。 每個(gè)對象將存儲關(guān)于 ZIP 歸檔的一個(gè)成員的信息。

有一個(gè)類(lèi)方法可以為文件系統文件創(chuàng )建 ZipInfo 實(shí)例:

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

為文件系統中的文件構造一個(gè) ZipInfo 實(shí)例,并準備將其添加到一個(gè) zip 文件。

filename 應為文件系統中某個(gè)文件或目錄的路徑。

如果指定了 arcname,它會(huì )被用作歸檔中的名稱(chēng)。 如果未指定 arcname,則所用名稱(chēng)與 filename 相同,但將去除任何驅動(dòng)器盤(pán)符和打頭的路徑分隔符。

strict_timestamps 參數在設為 False 時(shí)允許壓縮早于 1980-01-01 的文件,代價(jià)時(shí)會(huì )將時(shí)間戳設為 1980-01-01。 類(lèi)似的行為也會(huì )對晚于 2107-12-31 的文件發(fā)生,時(shí)間戳也會(huì )被設為該上限值。

3.6 新版功能.

在 3.6.2 版更改: filename 形參接受一個(gè) path-like object。

3.8 新版功能: strict_timestamps 僅限關(guān)鍵字參數

實(shí)例具有下列方法和屬性:

ZipInfo.is_dir()?

如果此歸檔成員是一個(gè)目錄則返回 True。

這會(huì )使用條目的名稱(chēng):目錄應當總是以 / 結尾。

3.6 新版功能.

ZipInfo.filename?

歸檔中的文件名稱(chēng)。

ZipInfo.date_time?

上次修改存檔成員的時(shí)間和日期。這是六個(gè)值的元組:

索引

0

Year (>= 1980)

1

月(1為基數)

2

月份中的日期(1為基數)

3

小時(shí)(0為基數)

4

分鐘(0為基數)

5

秒(0為基數)

備注

ZIP文件格式不支持1980年以前的時(shí)間戳。

ZipInfo.compress_type?

歸檔成員的壓縮類(lèi)型。

ZipInfo.comment?

bytes 對象形式的單個(gè)歸檔成員的注釋。

ZipInfo.extra?

擴展字段數據。 PKZIP Application Note 包含一些保存于該 bytes 對象中的內部結構的注釋。

ZipInfo.create_system?

創(chuàng )建 ZIP 歸檔所用的系統。

ZipInfo.create_version?

創(chuàng )建 ZIP 歸檔所用的 PKZIP 版本。

ZipInfo.extract_version?

需要用來(lái)提取歸檔的 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 模塊提供了簡(jiǎn)單的命令行接口用于與 ZIP 歸檔的交互。

如果你想要創(chuàng )建一個(gè)新的 ZIP 歸檔,請在 -c 選項后指定其名稱(chēng)然后列出應當被包含的文件名:

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

傳入一個(gè)目錄也是可接受的:

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

如果你想要將一個(gè) ZIP 歸檔提取到指定的目錄,請使用 -e 選項:

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

要獲取一個(gè) ZIP 歸檔中的文件列表,請使用 -l 選項:

$ python -m zipfile -l monty.zip

命令行選項?

-l <zipfile>?
--list <zipfile>?

列出一個(gè) zipfile 中的文件名。

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

基于源文件創(chuàng )建 zipfile。

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

將 zipfile 提取到目標目錄中。

-t <zipfile>?
--test <zipfile>?

檢測 zipfile 是否有效。

--metadata-encoding <encoding>?

Specify encoding of member names for -l, -e and -t.

3.11 新版功能.

解壓縮的障礙?

zipfile 模塊的提取操作可能會(huì )由于下面列出的障礙而失敗。

由于文件本身?

解壓縮可能由于不正確的密碼 / CRC 校驗和 / ZIP 格式或不受支持的壓縮 / 解密方法而失敗。

文件系統限制?

超出特定文件系統上的限制可能會(huì )導致解壓縮失敗。 例如目錄條目所允許的字符、文件名的長(cháng)度、路徑名的長(cháng)度、單個(gè)文件的大小以及文件的數量等等。

資源限制?

缺乏內存或磁盤(pán)空間將會(huì )導致解壓縮失敗。 例如,作用于 zipfile 庫的解壓縮炸彈 (即 ZIP bomb) 就可能造成磁盤(pán)空間耗盡。

中斷?

在解壓縮期間中斷執行,例如按下 ctrl-C 或殺死解壓縮進(jìn)程可能會(huì )導致歸檔文件的解壓縮不完整。

提取的默認行為?

不了解提取的默認行為可能導致不符合期望的解壓縮結果。 例如,當提取相同歸檔兩次時(shí),它會(huì )不經(jīng)詢(xún)問(wèn)地覆蓋文件。