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位擴充套件的
ZipFile.close()
關閉壓縮包,在退出程式之前要呼叫此函式關閉,否則會丟失剛寫入的資料。
ZipFile.getinfo(name)
返回一個ZipInfo物件。如果沒有定義ZipInfo物件,就會丟擲異常KeyError。
ZipFile.infolist()
返回壓縮包裡每個檔案的ZipInfo物件列表。
ZipFile.namelist()
返回壓縮裡檔案列表。
ZipFile.open(name, mode='r', pwd=None)
從一個壓縮包裡抽取一個檔案,返回此檔案物件。引數name是壓縮包裡的檔案列表裡的檔名稱或者ZipInfo物件;引數mode是開啟檔案的模式,支援r,U,rU模式;引數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_arcname是ZipInfo命名,還arcname名稱命名;引數bytes是要寫壓縮包的名稱;引數compress_type是壓縮的型別。
ZipFile.debug
除錯資訊的輸出的級別,可以設定從0到3,0表示沒有除錯資訊輸出,3表示輸出儘可能多的資訊。預設除錯資訊從sys.stdout輸出。
ZipFile.comment
ZIP檔案的備註資訊,寫入備註資訊時需要壓縮檔案按a或w開啟,並且備註資訊不超過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 深圳