做(zuò)自(zì)由與創造的先行(xíng)者

數(shù)據壓縮 | Data Compression zipfile

Python開(kāi)發手冊

ZIP文件格式是一(yī)種常用的歸檔和(hé)壓縮标準。此模塊提供了(le)創建,讀取,寫入,追加和(hé)列出ZIP文件的工(gōng)具。此模塊的任何高級用法都(dōu)需要(yào)了(le)解PKZIP應用說明(míng)中定義的格式。

此模塊目前不處理多磁盤ZIP文件。它可(kě)以處理使用ZIP64擴展名的ZIP文件(即大小超過4 GB的ZIP文件)。它支持在ZIP壓縮文件中解密加密文件,但(dàn)它目前不能(néng)創建加密文件。解密過程非常緩慢(màn),因為(wèi)它在本地(dì)Python而不是C中實現。

該模塊定義了(le)以下(xià)項目:

exception zipfile.BadZipfile

錯誤的ZIP文件(舊(jiù)名稱:)提出的錯誤zipfile.error。

exception zipfile.LargeZipFile

ZIP文件需要(yào)ZIP64功能(néng)但(dàn)尚未啓用時(shí)引發的錯誤。

class zipfile.ZipFile

用于讀寫ZIP文件的類。有關構造函數(shù)的詳細信息,請(qǐng)參見(jiàn)ZipFile Objects部分。

class zipfile.PyZipFile

用于創建包含Python庫的ZIP存檔的類。

class zipfile.ZipInfo([filename[, date_time]])

用于表示關于檔案成員(yuán)的信息的類。這(zhè)個類的實例由對象的方法getinfo()和(hé)infolist()方法返回ZipFile。該zipfile模塊的大多數(shù)用戶不需要(yào)創建這(zhè)些,但(dàn)隻能(néng)使用由該模塊創建的那(nà)些用戶。文件名應該是檔案成員(yuán)的全名,并且date_time應該是包含六個字段的元組,其描述對文件的最後修改的時(shí)間(jiān); 這(zhè)些字段在ZipInfo對象中進行(xíng)了(le)描述。

zipfile.is_zipfile(filename)

返回True如(rú)果文件名是基于它的幻數(shù)有效的ZIP文件,否則回報False。文件名也可(kě)以是文件或類似文件的對象。

在版本2.7中更改:支持文件和(hé)文件類對象。

zipfile.ZIP_STORED

未壓縮的歸檔成員(yuán)的數(shù)字常量。

zipfile.ZIP_DEFLATED

常用ZIP壓縮方法的數(shù)字常量。這(zhè)需要(yào)zlib模塊。目前不支持其他(tā)壓縮方法。

1. ZipFile對象

class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

打開(kāi)一(yī)個ZIP文件,其中文件可(kě)以是文件路徑(字符串)或文件類型的對象。該模式參數(shù)應該是'r'讀取現有的文件,'w'以截斷并寫入一(yī)個新的文件,或'a'将追加到現有文件。如(rú)果模式是,'a'并且文件引用了(le)現有的ZIP文件,則會向其中添加其他(tā)文件。如(rú)果文件沒有引用ZIP文件,則新的ZIP歸檔文件被追加到文件中。這(zhè)是為(wèi)了(le)将ZIP壓縮文件添加到其他(tā)文件(如(rú)python.exe)。

在版本2.6中更改:如(rú)果模式是,a并且該文件根本不存在,則會創建它。

壓縮是編寫壓縮文件時(shí)使用的ZIP壓縮方法,應該是ZIP_STORED或ZIP_DEFLATED; 無法識别的值會導緻RuntimeError提高。如(rú)果ZIP_DEFLATED被指定,但(dàn)zlib模塊不可(kě)用,RuntimeError也會引發。默認是ZIP_STORED。如(rú)果allowZip64是Truezipfile,則會在zip文件大于2 GB時(shí)創建使用ZIP64擴展名的ZIP文件。如(rú)果它是假的(默認)zipfile會在ZIP文件需要(yào)ZIP64擴展時(shí)引發異常。默認情況下(xià)禁用ZIP64擴展,因為(wèi)Unix上(shàng)的默認zip和(hé)unzip命令(InfoZIP實用程序)不支持這(zhè)些擴展。

改變在2.7.1版本:如(rú)果文件與模式創建'a'或'w'再closed不添加任何文件到歸檔,一(yī)個空歸檔适當的ZIP結構将被寫入該文件。

ZipFile也是一(yī)個上(shàng)下(xià)文管理器,因此支持該with語句。在這(zhè)個例子中,myzip在with語句套件完成後關閉- 即使發生異常:

with ZipFile('static/file/app-release', 'w') as myzip:

myzip.write('eggs.txt')

複制

2.7版新增功能(néng):增加了(le)ZipFile用作(zuò)上(shàng)下(xià)文管理器的功能(néng)。

ZipFile.close()

關閉檔案文件。您必須close()在退出程序之前撥打電話,否則不會寫入重要(yào)記錄。

ZipFile.getinfo(name)

ZipInfo用關于存檔成員(yuán)名稱的信息返回一(yī)個對象。調用getinfo()存檔中當前不包含的名稱将引發一(yī)個KeyError。

ZipFile.infolist()

返回包含ZipInfo每個檔案成員(yuán)的對象的列表。如(rú)果打開(kāi)了(le)現有的存檔,則這(zhè)些對象與磁盤上(shàng)實際ZIP文件中的條目順序相同。

ZipFile.namelist()

按名稱返回存檔成員(yuán)列表。

ZipFile.open(name[, mode[, pwd]])

從(cóng)存檔中提取成員(yuán)為(wèi)文件類對象(ZipExtFile)。name是檔案中文件的名稱或ZipInfo對象。所述模式參數(shù),如(rú)果包括的話,必須是下(xià)列之一(yī):'r'(默認值),'U'或'rU'。在隻讀對象中選擇'U'或'rU'将啓用通(tōng)用換行(xíng)支持。pwd是用于加密文件的密碼。調用open()一(yī)個封閉的ZipFile将引發一(yī)個RuntimeError。

注釋

的類文件對象是隻讀的,并且提供了(le)以下(xià)的方法:read(),readline(),readlines(),__iter__(),next()。

注釋

如(rú)果通(tōng)過傳入類文件對象作(zuò)為(wèi)構造函數(shù)的第一(yī)個參數(shù)來創建ZipFile,那(nà)麽通(tōng)過open()共享ZipFile的文件指針返回的對象。在這(zhè)些情況下(xià),open()在ZipFile對象上(shàng)執行(xíng)任何其他(tā)操作(zuò)之後,不應該使用返回的對象。如(rú)果ZipFile是通(tōng)過傳入一(yī)個字符串(文件名)作(zuò)為(wèi)構造函數(shù)的第一(yī)個參數(shù)來open()創建的,那(nà)麽将創建一(yī)個新的文件對象,該對象将由ZipExtFile保存,允許它獨立于ZipFile進行(xíng)操作(zuò)。

注釋

open(),read()和(hé)extract()方法可(kě)利用一(yī)個文件名或ZipInfo對象。嘗試閱讀包含具有重複名稱的成員(yuán)的ZIP文件時(shí),您會明(míng)白這(zhè)一(yī)點。

2.6版本中的新功能(néng)。

ZipFile.extract(member[, path[, pwd]])

将存檔中的成員(yuán)提取到當前工(gōng)作(zuò)目錄; 成員(yuán)必須是其全名或ZipInfo對象)。其文件信息盡可(kě)能(néng)準确地(dì)提取。路徑指定要(yào)提取到的不同目錄。成員(yuán)可(kě)以是文件名或ZipInfo對象。pwd是用于加密文件的密碼。

返回創建的規範化路徑(目錄或新文件)。

2.6版本中的新功能(néng)。

注釋

如(rú)果成員(yuán)的文件名是絕對路徑,驅動/ UNC SharePoint和(hé)領導(回)斜線将被剝離,如(rú):///foo/bar成為(wèi)foo/bar在Unix,并C:\foo\bar成為(wèi)foo\bar在Windows上(shàng)。".."成員(yuán)文件名中的所有組件都(dōu)将被删除,例如(rú):../../foo../../ba..r成為(wèi)foo../ba..r。在Windows非法字符(:,<,>,|,",?,并*用下(xià)劃線代替)( _)。

ZipFile.extractall([path[, members[, pwd]]])

将存檔中的所有成員(yuán)提取到當前工(gōng)作(zuò)目錄。路徑指定要(yào)提取到的不同目錄。成員(yuán)是可(kě)選的,并且必須是返回列表的子集namelist()。pwd是用于加密文件的密碼。

警告

切勿在未經事先檢查的情況下(xià)從(cóng)不受信任的來源提取檔案。有可(kě)能(néng)文件是在路徑之外(wài)創建的,例如(rú)具有"/"以兩個點開(kāi)頭的絕對文件名或具有兩個點的文件名的成員(yuán)".."。

在2.7.4版本中進行(xíng)了(le)更改:zipfile模塊試圖阻止該問(wèn)題。見(jiàn)extract()注。

2.6版本中的新功能(néng)。

ZipFile.printdir()

打印存檔的目錄到sys.stdout。

ZipFile.setpassword(pwd)

将pwd設置為(wèi)默認密碼以提取加密文件。

2.6版本中的新功能(néng)。

ZipFile.read(name[, pwd])

返回檔案中文件名稱的字節。name是檔案中文件的名稱或ZipInfo對象。檔案必須打開(kāi)才能(néng)閱讀或追加。pwd是用于加密文件的密碼,如(rú)果指定,它将覆蓋使用默認密碼設置setpassword()。調用read()一(yī)個封閉的ZipFile将引發一(yī)個RuntimeError。

在版本2.6中更改:pwd已添加,名稱現在可(kě)以是ZipInfo對象。

ZipFile.testzip()

閱讀檔案中的所有文件,并檢查它們的CRC和(hé)文件頭。返回第一(yī)個錯誤文件的名稱,否則返回None。調用testzip()一(yī)個封閉的ZipFile将引發一(yī)個RuntimeError。

ZipFile.write(filename[, arcname[, compress_type]])

寫命名的文件的文件名到歸檔,給它存檔名稱arcname(默認情況下(xià),這(zhè)将是相同的文件名,但(dàn)沒有一(yī)個驅動器号和(hé)與領先的路徑分隔符删除)。如(rú)果給定,compress_type将為(wèi)新條目覆蓋為(wèi)壓縮參數(shù)給構造函數(shù)指定的值。歸檔文件必須以模式打開(kāi),'w'或者'a'- 調用write()使用模式創建的ZipFile 'r'将引發一(yī)個RuntimeError。調用write()一(yī)個封閉的ZipFile将引發一(yī)個RuntimeError。

注釋

ZIP文件沒有官方文件名編碼。如(rú)果你有unicode文件名,你必須在将它們傳遞給你所需的編碼之前将它們轉換為(wèi)字節串write()。WinZip将所有文件名解釋為(wèi)在CP437中編碼,也稱為(wèi)DOS Latin。

注釋

檔案名稱應該與檔案根目錄相關,也就是說,它們不應該以路徑分隔符開(kāi)頭。

注釋

如(rú)果arcname(或者filename如(rú)果arcname未給出)包含空字節,則歸檔文件的名稱将在空字節處截斷。

ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])

将字符串字節寫入存檔; zinfo_or_arcname是它将在檔案中給出的文件名稱,或者是一(yī)個ZipInfo實例。如(rú)果它是一(yī)個實例,至少(shǎo)必須給出文件名,日期和(hé)時(shí)間(jiān)。如(rú)果是名稱,則日期和(hé)時(shí)間(jiān)設置為(wèi)當前日期和(hé)時(shí)間(jiān)。檔案必須用模式打開(kāi)'w'或'a'- 調用writestr()一(yī)個用模式創建的ZipFile 'r'會引發一(yī)個RuntimeError。調用writestr()一(yī)個封閉的ZipFile将引發一(yī)個RuntimeError。

如(rú)果給定,compress_type将覆蓋為(wèi)新條目的構造函數(shù)提供的壓縮參數(shù)的值,或覆蓋zinfo_or_arcname(如(rú)果是ZipInfo實例)的值。

注釋

當将ZipInfo實例作(zuò)為(wèi)zinfo_or_arcname參數(shù)傳遞時(shí),所使用的壓縮方法将是給定實例的compress_type成員(yuán)中指定的壓縮方法ZipInfo。默認情況下(xià),ZipInfo構造函數(shù)将此成員(yuán)設置為(wèi)ZIP_STORED。

在版本2.7中更改:compress_type參數(shù)。

以下(xià)數(shù)據屬性也可(kě)用:

ZipFile.debug

要(yào)使用的調試輸出的級别。這(zhè)可(kě)以從(cóng)0(默認,無輸出)到3(最多輸出)設置。調試信息被寫入sys.stdout。

ZipFile.comment

與ZIP文件關聯的評論文本。如(rú)果為(wèi)ZipFile使用模式'a'或'w'創建的實例分配注釋,這(zhè)應該是不超過65535字節的字符串。比此更長(cháng)的評論在close()被調用時(shí)會在書(shū)面存檔中被截斷。

2. PyZipFile對象

該PyZipFile構造函數(shù)将相同的參數(shù)ZipFile構造函數(shù)。實例除了(le)那(nà)些ZipFile對象外(wài)還有一(yī)種方法。

PyZipFile.writepy(pathname[, basename])

搜索文件*.py并将相應的文件添加到存檔。*.pyo如(rú)果可(kě)用的話,相應的文件是一(yī)個文件,否則是一(yī)個*.pyc文件,必要(yào)時(shí)編譯。如(rú)果路徑名是一(yī)個文件,則文件名必須以.py,并且隻有(對應的*.py[co])文件被添加到頂層(無路徑信息)。如(rú)果路徑名是不是結束一(yī)個文件.py,一(yī)個RuntimeError将提高。如(rú)果它是一(yī)個目錄,并且該目錄不是一(yī)個包目錄,則所有文件*.py[co]都(dōu)将添加到頂層。如(rú)果該目錄是一(yī)個包目錄,則所有*.py[co]這(zhè)些目錄都(dōu)将作(zuò)為(wèi)文件路徑添加到包名下(xià),如(rú)果有任何子目錄是包目錄,則所有這(zhè)些都(dōu)将遞歸添加。基本名僅供內(nèi)部使用。該writepy()方法使用以下(xià)文件名進行(xíng)歸檔:

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對象

ZipInfo類的實例由對象的方法getinfo()和(hé)infolist()方法返回ZipFile。每個對象存儲有關ZIP存檔的單個成員(yuán)的信息。

實例具有以下(xià)屬性:

ZipInfo.filename

歸檔文件的名稱。

ZipInfo.date_time

上(shàng)次修改歸檔成員(yuán)的時(shí)間(jiān)和(hé)日期。這(zhè)是一(yī)個包含六個值的元組:

指數(shù)

0

年(nián)份(> = 1980年(nián))

1

月份(基于單位)

2

一(yī)個月中的日(基于一(yī))

3

小時(shí)(從(cóng)零開(kāi)始)

4

分鐘(zhōng)(從(cóng)零開(kāi)始)

5

秒(零基)

注意

1980年(nián)以前,ZIP文件格式不支持時(shí)間(jiān)戳。

ZipInfo.compress_type

歸檔成員(yuán)的壓縮類型。

ZipInfo.comment

評論個人(rén)檔案成員(yuán)。

ZipInfo.extra

擴展字段數(shù)據。在PKZIP應用筆(bǐ)記包含包含在該字符串數(shù)據的內(nèi)部結構的一(yī)些意見(jiàn)。

ZipInfo.create_system

創建ZIP檔案的系統。

ZipInfo.create_version

創建ZIP壓縮文件的PKZIP版本。

ZipInfo.extract_version

PKZIP版本需要(yào)提取歸檔。

ZipInfo.reserved

必須為(wèi)零。

ZipInfo.flag_bits

ZIP标志位。

ZipInfo.volume

文件頭的卷号。

ZipInfo.internal_attr

內(nèi)部屬性。

ZipInfo.external_attr

外(wài)部文件屬性。

ZipInfo.header_offset

字節偏移到文件頭。

ZipInfo.CRC

未壓縮文件的CRC-32。

ZipInfo.compress_size

壓縮數(shù)據的大小。

ZipInfo.file_size

未壓縮文件的大小。

4.命令行(xíng)界面

該zipfile模塊提供了(le)一(yī)個簡單的命令行(xíng)界面來與ZIP檔案進行(xíng)交互。

如(rú)果您想創建一(yī)個新的ZIP存檔,請(qǐng)在-c選項後指定其名稱,然後列出應包含的文件名:

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

複制

傳遞一(yī)個目錄也是可(kě)以接受的:

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

複制

如(rú)果要(yào)将ZIP壓縮文件解壓縮到指定的目錄中,請(qǐng)使用以下(xià)-e選項:

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

複制

有關ZIP歸檔文件的列表,請(qǐng)使用以下(xià)-l選項:

static/file/app-release

複制

4.1.命令行(xíng)選項

-l <zipfile>

列出zipfile文件。

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

從(cóng)源文件創建zipfile。

-e <zipfile> <output_dir>

将zipfile解壓縮到目标目錄中。

-t <zipfile>

糾錯

測試zip文件是否有效。

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發