1. 程式人生 > >10.5 zipfile--支援ZIP壓縮包

10.5 zipfile--支援ZIP壓縮包

ZIP檔案格式是一個通用的壓縮包,本模組主要提供了對這種格式檔案進行建立、讀取、寫入、增加和讀取檔案列表。本模組不支援多卷壓縮的功能,普通的ZIP檔案只能4G大小,如果想使用更大的檔案要使用ZIP64擴充套件方式。本模組支援開啟有加密的壓縮包檔案,但不支援建立加密的壓縮包檔案,並且解密的速度比C語言的方式實現要慢。

exception zipfile.BadZipFile

當解壓ZIP檔案出錯時丟擲此異常。

exception zipfile.BadZipfile

相容舊的異常,從Python3.2版本之後丟棄使用。

exception zipfile.LargeZipFile

當開啟ZIP64壓縮的檔案時,但設定不允許支援這種格式時就會丟擲異常。

class zipfile.ZipFile

定義讀寫ZIP檔案的類。

class zipfile.PyZipFile

建立一個ZIP壓縮類,包含Python庫。

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

建立一個表示壓縮包的資訊類。

zipfile.is_zipfile(filename)

判斷檔名的ZIP檔案或檔案物件是否為合法的ZIP檔案,如果是返回True,否則返回False

zipfile.ZIP_STORED

表示非壓縮的常量。

zipfile.ZIP_DEFLATED

表示採用ZIP壓縮的常量。

zipfile.ZIP_BZIP2

表示採用BZIP2壓縮的常量。

zipfile.ZIP_LZMA

表示採用LZMA壓縮的常量。

10.5.1 ZipFile物件

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)

開啟ZIP檔案,引數file可以壓縮檔案的名稱或檔案物件。引數mode是表示對壓縮檔案進行讀或寫,如果是w表示是寫入,會清空檔案已經存在的所有資料,再從頭開始寫入;引數compression是表示採用什麼方式壓縮,預設是儲存不壓縮;引數allowZip64是表示是否使用64位擴充套件的

ZIP檔案格式。

ZipFile.close()

關閉壓縮包,在退出程式之前要呼叫此函式關閉,否則會丟失剛寫入的資料。

ZipFile.getinfo(name)

返回一個ZipInfo物件。如果沒有定義ZipInfo物件,就會丟擲異常KeyError

ZipFile.infolist()

返回壓縮包裡每個檔案的ZipInfo物件列表。

ZipFile.namelist()

返回壓縮裡檔案列表。

ZipFile.open(name, mode='r', pwd=None)

從一個壓縮包裡抽取一個檔案,返回此檔案物件。引數name是壓縮包裡的檔案列表裡的檔名稱或者ZipInfo物件;引數mode是開啟檔案的模式,支援rUrU模式;引數pwd是開啟壓縮檔案的密碼。

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

從壓縮包裡抽取一個檔案放到當前工作的目錄下,引數member是檔名稱或者ZipInfo物件;引數path是指定抽取檔案放入的目標路徑;引數pwd是解壓的密碼。

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

從壓縮包裡抽取所有檔案到當前工作的目錄下,如果引數path設定就放到這個目錄下面;引數members是可選的引數,如果設定,就是這部分的檔案解壓出來,並且設定檔案列表要小於壓縮包裡所有檔案的列表;引數pwd是解壓的密碼。

ZipFile.printdir()

以表格的形式把壓縮包的資訊向sys.stdout輸出。

ZipFile.setpassword(pwd)

設定預設解壓縮包的密碼。引數pwd是解壓密碼。

ZipFile.read(name, pwd=None)

讀取壓縮包裡指定的檔案,返回相應資料。引數name是壓縮包裡指定的檔名稱;引數pwd是解壓的密碼。

ZipFile.testzip()

讀取壓縮包裡所有檔案,並檢查CRC和檔案頭是否正確,如果不正確返回第一個出錯的檔名稱;如果全部正確返回None

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

寫檔名稱filename的檔案到壓縮包。引數filename是要寫入壓縮的檔案路徑;引數arcname是寫入的檔案在壓縮包裡的檔名稱;引數compress_type是指定壓縮的方式,也即是不使用建構函式時的壓縮級別。

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

寫入字串bytes到壓縮包。引數zinfo_or_arcnameZipInfo命名,還arcname名稱命名;引數bytes是要寫壓縮包的名稱;引數compress_type是壓縮的型別。

ZipFile.debug

除錯資訊的輸出的級別,可以設定從030表示沒有除錯資訊輸出,3表示輸出儘可能多的資訊。預設除錯資訊從sys.stdout輸出。

ZipFile.comment

ZIP檔案的備註資訊,寫入備註資訊時需要壓縮檔案按aw開啟,並且備註資訊不超過65535個位元組。

10.5.2 PyZipFile物件

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

開啟一個PyZipFile檔案物件,引數與ZipFile類建構函式一樣。

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

搜尋所有*.py檔案,並新增到壓縮包。引數pathname是一個檔名稱,必須帶有py字尾的檔案,並且會把pyc或者pyo檔案新增到壓縮包;如果引數pathname是一個目錄,在這個目錄下面所有的.py檔案都會新增到壓縮包,同時會根據引數optimize來決定選擇新增pyo檔案,還是pyc檔案。引數basename是內部使用;引數filterfunc是帶有單一引數的函式,用來判斷傳送入來的檔案是否新增到壓縮包,如果返回False就不新增到壓縮包。

10.5.2 ZipInfo物件

從函式getinfo()infolist()返回ZipInfo物件,每個物件的屬性如下:

ZipInfo.filename

在壓縮包裡檔案的名稱。

ZipInfo.date_time

檔案在壓縮包裡最後修改的時間。

ZipInfo.compress_type

採用什麼壓縮型別。

ZipInfo.comment

每個檔案的備註資訊。

ZipInfo.extra

壓縮方法另外使用的資料。

ZipInfo.create_system

建立ZIP的系統名稱。

ZipInfo.create_version

建立ZIP壓縮包的PKZIP版本。

ZipInfo.extract_version

解壓此壓縮包的要求的PKZIP版本。

ZipInfo.reserved

保留位元組,必須設定為0

ZipInfo.flag_bits

ZIP標誌位。

ZipInfo.volume

檔案頭的卷號。

ZipInfo.internal_attr

內部屬性。

ZipInfo.external_attr

額外的檔案屬性。

ZipInfo.header_offset

相對檔案頭的偏移位置。

ZipInfo.CRC

未壓縮時檔案的CRC32校驗碼。

ZipInfo.compress_size

檔案壓縮之後資料的大小。

ZipInfo.file_size

檔案未壓縮之前的大小。

建立Zip檔案的例子:

#python 3.4

import zipfile

zf = zipfile.ZipFile('F:\\temp\\py\\test.zip', mode = 'w')

try:

    zf.write('F:\\temp\\py\\readme.txt')

    print('寫入檔案')

finally:

    zf.close()

    print('關閉')

結果輸出如下:

寫入檔案

關閉

追加檔案的例子:

#python 3.4

import zipfile

zf = zipfile.ZipFile('F:\\temp\\py\\test.zip', mode = 'a')

try:

    zf.write('F:\\temp\\py\\readme2.txt')

    print('寫入檔案')

finally:

    zf.close()

    print('關閉')

結果輸出如下:

寫入檔案

關閉

從追加檔案例子看來,與建立Zip檔案的例子相比,主要是寫入的模式mode不同,建立使用w的模式,而追加是使用a的模式。

開啟Zip檔案的例子:

#python 3.4

import zipfile

#判斷檔案是否一個有效的ZIP檔案

filename = 'F:\\temp\\py\\test.zip'

print('F:\\temp\\py\\test.zip: ', zipfile.is_zipfile(filename))

zf = zipfile.ZipFile(filename, mode = 'r')

#讀取壓縮包裡的檔案列表

print(zf.namelist())

for fn in zf.namelist():

    data = zf.read(fn)

    print(fn)

    print(repr(data))

zf.close()

結果輸出如下:

F:\temp\py\test.zip:  True

['temp/py/readme.txt', 'temp/py/readme2.txt']

temp/py/readme.txt

b'http://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse'

temp/py/readme2.txt

b'http://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse'

打包py檔案的例子:

#python 3.4

import zipfile

#判斷檔案是否一個有效的ZIP檔案

filename = 'F:\\temp\\py\\testpy.zip'

zf = zipfile.PyZipFile(filename, mode = 'w')

try:

    zf.debug = 3

    zf.writepy('F:\\temp\\py')

finally:

    zf.close()

    for name in zf.namelist():

        print(name)

zf.close()

結果輸出如下:

Adding files from directory F:\temp\py

Compiling F:\temp\py\bisect2.py

Adding bisect2.pyc

Compiling F:\temp\py\cal_1.py

Adding cal_1.pyc

Compiling F:\temp\py\chainmap1.py

Adding chainmap1.pyc

Compiling F:\temp\py\chainmap2.py

Adding chainmap2.pyc

Compiling F:\temp\py\closescreen.py

Adding closescreen.pyc

Compiling F:\temp\py\codecs1.py

Adding codecs1.pyc

Compiling F:\temp\py\complex1.py

Adding complex1.pyc

Compiling F:\temp\py\copy1.py

Adding copy1.pyc

Compiling F:\temp\py\datetimetz.py

Adding datetimetz.pyc

Compiling F:\temp\py\dec1.py

Adding dec1.pyc

Compiling F:\temp\py\difflib1.py

Adding difflib1.pyc

Compiling F:\temp\py\difflib2.py

Adding difflib2.pyc

Compiling F:\temp\py\difflib3.py

Adding difflib3.pyc

Compiling F:\temp\py\difflib4.py

Adding difflib4.pyc

Compiling F:\temp\py\difflib5.py

Adding difflib5.pyc

Compiling F:\temp\py\test888.py

Adding test888.pyc

bisect2.pyc

cal_1.pyc

chainmap1.pyc

chainmap2.pyc

closescreen.pyc

codecs1.pyc

complex1.pyc

copy1.pyc

datetimetz.pyc

dec1.pyc

difflib1.pyc

difflib2.pyc

difflib3.pyc

difflib4.pyc

difflib5.pyc

test888.pyc

蔡軍生  QQ:9073204  深圳