做自(zì)由與創造的先行者

數據壓縮 | Data Compression zipfile

Python開(kāi)發手冊

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)發
下(xià)一篇:數據持久性 | Data Persistence anydbm
上(shàng)一篇:數據壓縮 | Data Compression tarfile