ZIP文(wén)件格式是一種常用(yòng)的歸檔和(hé)壓縮标準。此模塊提供了(le)創建,讀取,寫入,追加和(hé)列出ZIP文(wén)件的工(gōng)具。此模塊的任何高(gāo)級用(yòng)法都需要了(le)解PKZIP應用(yòng)說明(míng)中定義的格式。
此模塊目前不處理(lǐ)多磁盤ZIP文(wén)件。它可以處理(lǐ)使用(yòng)ZIP64擴展名的ZIP文(wén)件(即大(dà)小(xiǎo)超過4 GB的ZIP文(wén)件)。它支持在ZIP壓縮文(wén)件中解密加密文(wén)件,但(dàn)它目前不能(néng)創建加密文(wén)件。解密過程非常緩慢,因爲它在本地Python而不是C中實現(xiàn)。
該模塊定義了(le)以下(xià)項目:
exception zipfile.BadZipfile
錯誤的ZIP文(wén)件(舊名稱:)提出的錯誤zipfile.error。
exception zipfile.LargeZipFile
ZIP文(wén)件需要ZIP64功能(néng)但(dàn)尚未啓用(yòng)時(shí)引發的錯誤。
class zipfile.ZipFile
用(yòng)于讀寫ZIP文(wén)件的類。有關構造函數的詳細信息,請(qǐng)參見ZipFile Objects部分。
class zipfile.PyZipFile
用(yòng)于創建包含Python庫的ZIP存檔的類。
class zipfile.ZipInfo([filename[, date_time]])
用(yòng)于表示關于檔案成員的信息的類。這(zhè)個類的實例由對(duì)象的方法getinfo()和(hé)infolist()方法返回ZipFile。該zipfile模塊的大(dà)多數用(yòng)戶不需要創建這(zhè)些(xiē),但(dàn)隻能(néng)使用(yòng)由該模塊創建的那些(xiē)用(yòng)戶。文(wén)件名應該是檔案成員的全名,并且date_time應該是包含六個字段的元組,其描述對(duì)文(wén)件的最後修改的時(shí)間; 這(zhè)些(xiē)字段在ZipInfo對(duì)象中進行了(le)描述。
zipfile.is_zipfile(filename)
返回True如果文(wén)件名是基于它的幻數有效的ZIP文(wén)件,否則回報(bào)False。文(wén)件名也(yě)可以是文(wén)件或類似文(wén)件的對(duì)象。
在版本2.7中更改:支持文(wén)件和(hé)文(wén)件類對(duì)象。
zipfile.ZIP_STORED
未壓縮的歸檔成員的數字常量。
zipfile.ZIP_DEFLATED
常用(yòng)ZIP壓縮方法的數字常量。這(zhè)需要zlib模塊。目前不支持其他(tā)壓縮方法。
1. ZipFile對(duì)象
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
打開(kāi)一個ZIP文(wén)件,其中文(wén)件可以是文(wén)件路徑(字符串)或文(wén)件類型的對(duì)象。該模式參數應該是'r'讀取現(xiàn)有的文(wén)件,'w'以截斷并寫入一個新的文(wén)件,或'a'将追加到(dào)現(xiàn)有文(wén)件。如果模式是,'a'并且文(wén)件引用(yòng)了(le)現(xiàn)有的ZIP文(wén)件,則會(huì)向其中添加其他(tā)文(wén)件。如果文(wén)件沒有引用(yòng)ZIP文(wén)件,則新的ZIP歸檔文(wén)件被追加到(dào)文(wén)件中。這(zhè)是爲了(le)将ZIP壓縮文(wén)件添加到(dào)其他(tā)文(wén)件(如python.exe)。
在版本2.6中更改:如果模式是,a并且該文(wén)件根本不存在,則會(huì)創建它。
壓縮是編寫壓縮文(wén)件時(shí)使用(yòng)的ZIP壓縮方法,應該是ZIP_STORED或ZIP_DEFLATED; 無法識别的值會(huì)導緻RuntimeError提高(gāo)。如果ZIP_DEFLATED被指定,但(dàn)zlib模塊不可用(yòng),RuntimeError也(yě)會(huì)引發。默認是ZIP_STORED。如果allowZip64是Truezipfile,則會(huì)在zip文(wén)件大(dà)于2 GB時(shí)創建使用(yòng)ZIP64擴展名的ZIP文(wén)件。如果它是假的(默認)zipfile會(huì)在ZIP文(wén)件需要ZIP64擴展時(shí)引發異常。默認情況下(xià)禁用(yòng)ZIP64擴展,因爲Unix上(shàng)的默認zip和(hé)unzip命令(InfoZIP實用(yòng)程序)不支持這(zhè)些(xiē)擴展。
改變在2.7.1版本:如果文(wén)件與模式創建'a'或'w'再closed不添加任何文(wén)件到(dào)歸檔,一個空(kōng)歸檔适當的ZIP結構将被寫入該文(wén)件。
ZipFile也(yě)是一個上(shàng)下(xià)文(wén)管理(lǐ)器,因此支持該with語句。在這(zhè)個例子中,myzip在with語句套件完成後關閉- 即使發生異常:
with ZipFile('static/file/spam', 'w') as myzip:
myzip.write('eggs.txt')
複制
2.7版新增功能(néng):增加了(le)ZipFile用(yòng)作(zuò)上(shàng)下(xià)文(wén)管理(lǐ)器的功能(néng)。
ZipFile.close()
關閉檔案文(wén)件。您必須close()在退出程序之前撥打電話(huà),否則不會(huì)寫入重要記錄。
ZipFile.getinfo(name)
ZipInfo用(yòng)關于存檔成員名稱的信息返回一個對(duì)象。調用(yòng)getinfo()存檔中當前不包含的名稱将引發一個KeyError。
ZipFile.infolist()
返回包含ZipInfo每個檔案成員的對(duì)象的列表。如果打開(kāi)了(le)現(xiàn)有的存檔,則這(zhè)些(xiē)對(duì)象與磁盤上(shàng)實際ZIP文(wén)件中的條目順序相同。
ZipFile.namelist()
按名稱返回存檔成員列表。
ZipFile.open(name[, mode[, pwd]])
從(cóng)存檔中提取成員爲文(wén)件類對(duì)象(ZipExtFile)。name是檔案中文(wén)件的名稱或ZipInfo對(duì)象。所述模式參數,如果包括的話(huà),必須是下(xià)列之一:'r'(默認值),'U'或'rU'。在隻讀對(duì)象中選擇'U'或'rU'将啓用(yòng)通用(yòng)換行支持。pwd是用(yòng)于加密文(wén)件的密碼。調用(yòng)open()一個封閉的ZipFile将引發一個RuntimeError。
注釋
的類文(wén)件對(duì)象是隻讀的,并且提供了(le)以下(xià)的方法:read(),readline(),readlines(),__iter__(),next()。
注釋
如果通過傳入類文(wén)件對(duì)象作(zuò)爲構造函數的第一個參數來(lái)創建ZipFile,那麽通過open()共享ZipFile的文(wén)件指針返回的對(duì)象。在這(zhè)些(xiē)情況下(xià),open()在ZipFile對(duì)象上(shàng)執行任何其他(tā)操作(zuò)之後,不應該使用(yòng)返回的對(duì)象。如果ZipFile是通過傳入一個字符串(文(wén)件名)作(zuò)爲構造函數的第一個參數來(lái)open()創建的,那麽将創建一個新的文(wén)件對(duì)象,該對(duì)象将由ZipExtFile保存,允許它獨立于ZipFile進行操作(zuò)。
注釋
open(),read()和(hé)extract()方法可利用(yòng)一個文(wén)件名或ZipInfo對(duì)象。嘗試閱讀包含具有重複名稱的成員的ZIP文(wén)件時(shí),您會(huì)明(míng)白(bái)這(zhè)一點。
2.6版本中的新功能(néng)。
ZipFile.extract(member[, path[, pwd]])
将存檔中的成員提取到(dào)當前工(gōng)作(zuò)目錄; 成員必須是其全名或ZipInfo對(duì)象)。其文(wén)件信息盡可能(néng)準确地提取。路徑指定要提取到(dào)的不同目錄。成員可以是文(wén)件名或ZipInfo對(duì)象。pwd是用(yòng)于加密文(wén)件的密碼。
返回創建的規範化路徑(目錄或新文(wén)件)。
2.6版本中的新功能(néng)。
注釋
如果成員的文(wén)件名是絕對(duì)路徑,驅動/ UNC SharePoint和(hé)領導(回)斜線将被剝離,如:///foo/bar成爲foo/bar在Unix,并C:\foo\bar成爲foo\bar在Windows上(shàng)。".."成員文(wén)件名中的所有組件都将被删除,例如:../../foo../../ba..r成爲foo../ba..r。在Windows非法字符(:,<,>,|,",?,并*用(yòng)下(xià)劃線代替)( _)。
ZipFile.extractall([path[, members[, pwd]]])
将存檔中的所有成員提取到(dào)當前工(gōng)作(zuò)目錄。路徑指定要提取到(dào)的不同目錄。成員是可選的,并且必須是返回列表的子集namelist()。pwd是用(yòng)于加密文(wén)件的密碼。
警告
切勿在未經事(shì)先檢查的情況下(xià)從(cóng)不受信任的來(lái)源提取檔案。有可能(néng)文(wén)件是在路徑之外(wài)創建的,例如具有"/"以兩個點開(kāi)頭的絕對(duì)文(wén)件名或具有兩個點的文(wén)件名的成員".."。
在2.7.4版本中進行了(le)更改:zipfile模塊試圖阻止該問題。見extract()注。
2.6版本中的新功能(néng)。
ZipFile.printdir()
打印存檔的目錄到(dào)sys.stdout。
ZipFile.setpassword(pwd)
将pwd設置爲默認密碼以提取加密文(wén)件。
2.6版本中的新功能(néng)。
ZipFile.read(name[, pwd])
返回檔案中文(wén)件名稱的字節。name是檔案中文(wén)件的名稱或ZipInfo對(duì)象。檔案必須打開(kāi)才能(néng)閱讀或追加。pwd是用(yòng)于加密文(wén)件的密碼,如果指定,它将覆蓋使用(yòng)默認密碼設置setpassword()。調用(yòng)read()一個封閉的ZipFile将引發一個RuntimeError。
在版本2.6中更改:pwd已添加,名稱現(xiàn)在可以是ZipInfo對(duì)象。
ZipFile.testzip()
閱讀檔案中的所有文(wén)件,并檢查它們的CRC和(hé)文(wén)件頭。返回第一個錯誤文(wén)件的名稱,否則返回None。調用(yòng)testzip()一個封閉的ZipFile将引發一個RuntimeError。
ZipFile.write(filename[, arcname[, compress_type]])
寫命名的文(wén)件的文(wén)件名到(dào)歸檔,給它存檔名稱arcname(默認情況下(xià),這(zhè)将是相同的文(wén)件名,但(dàn)沒有一個驅動器号和(hé)與領先的路徑分隔符删除)。如果給定,compress_type将爲新條目覆蓋爲壓縮參數給構造函數指定的值。歸檔文(wén)件必須以模式打開(kāi),'w'或者'a'- 調用(yòng)write()使用(yòng)模式創建的ZipFile 'r'将引發一個RuntimeError。調用(yòng)write()一個封閉的ZipFile将引發一個RuntimeError。
注釋
ZIP文(wén)件沒有官方文(wén)件名編碼。如果你(nǐ)有unicode文(wén)件名,你(nǐ)必須在将它們傳遞給你(nǐ)所需的編碼之前将它們轉換爲字節串write()。WinZip将所有文(wén)件名解釋爲在CP437中編碼,也(yě)稱爲DOS Latin。
注釋
檔案名稱應該與檔案根目錄相關,也(yě)就是說,它們不應該以路徑分隔符開(kāi)頭。
注釋
如果arcname(或者filename如果arcname未給出)包含空(kōng)字節,則歸檔文(wén)件的名稱将在空(kōng)字節處截斷。
ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])
将字符串字節寫入存檔; zinfo_or_arcname是它将在檔案中給出的文(wén)件名稱,或者是一個ZipInfo實例。如果它是一個實例,至少必須給出文(wén)件名,日期和(hé)時(shí)間。如果是名稱,則日期和(hé)時(shí)間設置爲當前日期和(hé)時(shí)間。檔案必須用(yòng)模式打開(kāi)'w'或'a'- 調用(yòng)writestr()一個用(yòng)模式創建的ZipFile 'r'會(huì)引發一個RuntimeError。調用(yòng)writestr()一個封閉的ZipFile将引發一個RuntimeError。
如果給定,compress_type将覆蓋爲新條目的構造函數提供的壓縮參數的值,或覆蓋zinfo_or_arcname(如果是ZipInfo實例)的值。
注釋
當将ZipInfo實例作(zuò)爲zinfo_or_arcname參數傳遞時(shí),所使用(yòng)的壓縮方法将是給定實例的compress_type成員中指定的壓縮方法ZipInfo。默認情況下(xià),ZipInfo構造函數将此成員設置爲ZIP_STORED。
在版本2.7中更改:compress_type參數。
以下(xià)數據屬性也(yě)可用(yòng):
ZipFile.debug
要使用(yòng)的調試輸出的級别。這(zhè)可以從(cóng)0(默認,無輸出)到(dào)3(最多輸出)設置。調試信息被寫入sys.stdout。
ZipFile.comment
與ZIP文(wén)件關聯的評論文(wén)本。如果爲ZipFile使用(yòng)模式'a'或'w'創建的實例分配注釋,這(zhè)應該是不超過65535字節的字符串。比此更長的評論在close()被調用(yòng)時(shí)會(huì)在書面存檔中被截斷。
2. PyZipFile對(duì)象
該PyZipFile構造函數将相同的參數ZipFile構造函數。實例除了(le)那些(xiē)ZipFile對(duì)象外(wài)還有一種方法。
PyZipFile.writepy(pathname[, basename])
搜索文(wén)件*.py并将相應的文(wén)件添加到(dào)存檔。*.pyo如果可用(yòng)的話(huà),相應的文(wén)件是一個文(wén)件,否則是一個*.pyc文(wén)件,必要時(shí)編譯。如果路徑名是一個文(wén)件,則文(wén)件名必須以.py,并且隻有(對(duì)應的*.py[co])文(wén)件被添加到(dào)頂層(無路徑信息)。如果路徑名是不是結束一個文(wén)件.py,一個RuntimeError将提高(gāo)。如果它是一個目錄,并且該目錄不是一個包目錄,則所有文(wén)件*.py[co]都将添加到(dào)頂層。如果該目錄是一個包目錄,則所有*.py[co]這(zhè)些(xiē)目錄都将作(zuò)爲文(wén)件路徑添加到(dào)包名下(xià),如果有任何子目錄是包目錄,則所有這(zhè)些(xiē)都将遞歸添加。基本名僅供内部使用(yòng)。該writepy()方法使用(yòng)以下(xià)文(wén)件名進行歸檔:
string.pyc # Top level name
test/__init__.pyc # Package directory
test/test_support.pyc # Module test.test_support
test/bogus/__init__.pyc # Subpackage directory
test/bogus/myfile.pyc # Submodule test.bogus.myfile
複制
3. ZipInfo對(duì)象
ZipInfo類的實例由對(duì)象的方法getinfo()和(hé)infolist()方法返回ZipFile。每個對(duì)象存儲有關ZIP存檔的單個成員的信息。
實例具有以下(xià)屬性:
ZipInfo.filename
歸檔文(wén)件的名稱。
ZipInfo.date_time
上(shàng)次修改歸檔成員的時(shí)間和(hé)日期。這(zhè)是一個包含六個值的元組:
指數 | 值 |
---|---|
0 | 年份(> = 1980年) |
1 | 月份(基于單位) |
2 | 一個月中的日(基于一) |
3 | 小(xiǎo)時(shí)(從(cóng)零開(kāi)始) |
4 | 分鐘(zhōng)(從(cóng)零開(kāi)始) |
5 | 秒(零基) |
注意
1980年以前,ZIP文(wén)件格式不支持時(shí)間戳。
ZipInfo.compress_type
歸檔成員的壓縮類型。
ZipInfo.comment
評論個人檔案成員。
ZipInfo.extra
擴展字段數據。在PKZIP應用(yòng)筆(bǐ)記包含包含在該字符串數據的内部結構的一些(xiē)意見。
ZipInfo.create_system
創建ZIP檔案的系統。
ZipInfo.create_version
創建ZIP壓縮文(wén)件的PKZIP版本。
ZipInfo.extract_version
PKZIP版本需要提取歸檔。
ZipInfo.reserved
必須爲零。
ZipInfo.flag_bits
ZIP标志位。
ZipInfo.volume
文(wén)件頭的卷号。
ZipInfo.internal_attr
内部屬性。
ZipInfo.external_attr
外(wài)部文(wén)件屬性。
ZipInfo.header_offset
字節偏移到(dào)文(wén)件頭。
ZipInfo.CRC
未壓縮文(wén)件的CRC-32。
ZipInfo.compress_size
壓縮數據的大(dà)小(xiǎo)。
ZipInfo.file_size
未壓縮文(wén)件的大(dà)小(xiǎo)。
4.命令行界面
該zipfile模塊提供了(le)一個簡單的命令行界面來(lái)與ZIP檔案進行交互。
如果您想創建一個新的ZIP存檔,請(qǐng)在-c選項後指定其名稱,然後列出應包含的文(wén)件名:
$ python -m zipfile -c monty.zip spam.txt eggs.txt
複制
傳遞一個目錄也(yě)是可以接受的:
$ python -m zipfile -c monty.zip life-of-brian_1979/
複制
如果要将ZIP壓縮文(wén)件解壓縮到(dào)指定的目錄中,請(qǐng)使用(yòng)以下(xià)-e選項:
$ python -m zipfile -e monty.zip target-dir/
複制
有關ZIP歸檔文(wén)件的列表,請(qǐng)使用(yòng)以下(xià)-l選項:
static/file/spam
複制
4.1.命令行選項
-l <zipfile>
列出zipfile文(wén)件。
-c <zipfile> <source1> ... <sourceN>
從(cóng)源文(wén)件創建zipfile。
-e <zipfile> <output_dir>
将zipfile解壓縮到(dào)目标目錄中。
-t <zipfile>
糾錯
測試zip文(wén)件是否有效。
網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發