Python打開zip文件

? ? Zip文件格式是通用的文檔壓縮標(biāo)準(zhǔn)。自1.6版本起,Python中zipfile模塊能夠直接處理zip文件里的數(shù)據(jù),例如需要將對應(yīng)目錄或多個(gè)文件打包或壓縮成zip格式,或者需要查看一個(gè)zip格式的歸檔文件中部分或者所有文件同時(shí)避免講這些文件展開到磁盤上。使用ZipFile類來操作zip文件。

創(chuàng)建一個(gè)ZipFile對象,表示一個(gè)zip文件。

? ??\bullet 參數(shù)file:文件的路徑或者類似文件對象

? ??\bullet 參數(shù)mode:讀"r",寫入"w",添加"a"

? ??\bullet 參數(shù)compression: ZIP_STORED(無壓縮),ZIP_DEFLATED(壓縮,需要zlib支持)

? ??\bullet 參數(shù)allowZip64:默認(rèn)情況下報(bào)錯(cuò),將其設(shè)為True,ZipFile將用ZIP64擴(kuò)展進(jìn)行創(chuàng)建文件。

解壓ZIP文檔中的所有文件到指定目錄

下面示例演示了讀取一個(gè)zip文檔,將文檔里所有文件解壓到名為"work"的文件里。

import zipfile

if __name__ == "__main__":

? ? zFile = zipfile.ZipFile("F:\\txt.zip","r")

? ? #ZipFile.namelist():獲取ZIP文檔內(nèi)所有文件的名稱列表

? ? for fileM in zFile.namelist():

? ? ? ? zFile.extract(fileM,"F:\\work")

? ? ? ? zFile.close()


讀取ZIP文檔內(nèi)某個(gè)文件

read(self,name,pwd=None)獲取ZIP文檔內(nèi)文件的二進(jìn)制數(shù)據(jù)

下面例子演示了使用read方法獲取ZIP文檔中mango.txt文件的數(shù)據(jù),并寫到copy.txt文件中

import zipfile?

if __name__ == "__main__":

? ? zipFile = zipfile.ZipFile('F:\\test.zip','r')

? ? data = zipFile.read("mango.txt")

? ? (lambda f,d:(f.write(d),f.close()))(open("F:\\copy.txt,'w"),data)

? ? zipFile.close()


將文件生成ZIP文檔

write(self, filename, arcname=None, compress_type=None)將指定文件寫入ZIP文檔中

? ??\star 參數(shù)filename:需要寫入文件的路徑

? ??\star 參數(shù)arcname:文件寫入ZIP文檔后保存的文件名

? ??\star 參數(shù)compress_type:壓縮方法(ZIP_STORED或ZIP_DEFAULED)

下面離子演示了創(chuàng)建一個(gè)zip文檔,將test.docx文件寫入壓縮文檔里面。

import zipfile

if __name__ == "__main__":

? ? zipFile = zipfile.ZipFile("F:\\test.zip","w")

? ? zipFile.write("F:\\test.docx","ok.docx",zipfile.ZIP_DEFLATED)

? ? zipFile.close()


獲取ZIP文檔中某個(gè)文件的信息

getinfo(name)返回一個(gè)ZipInfo類的對象。

import zipfile

if __name__ == "__main__":

? ? zipInfo = zipFile.getinfo(ok.docx)

? ? print("filename:",zipInfo.filename)

? ? print("date_time:",zipInfo.date_time)

常用函數(shù)

ZipFile.close()

關(guān)閉歸檔文件,你必須在退出程序之前調(diào)用close()否則將不會寫入關(guān)鍵記錄數(shù)據(jù)。

ZipFile.getinfo(name)

返回一個(gè)ZipInfo對象,其中包含有關(guān)歸檔成員name的信息。針對一個(gè)目前并不包含于歸檔中的名稱調(diào)用getinfo()將會引發(fā)KeyError。

ZipFile.infolist()

? ?返回一個(gè)列表,其中包含每個(gè)歸檔成員的ZipInfo對象。如果是打開一個(gè)現(xiàn)有歸檔則這些對象的排列順序與他們對于條目在磁盤上的實(shí)際ZIP文件中的順序一致。

ZipFile.namelist()

返回按名稱排列的歸檔成員列表。

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

以二進(jìn)制文件類對象的形式訪一個(gè)歸檔成員。name可以是歸檔內(nèi)某個(gè)文件的名稱也可以是某個(gè)ZipInfo對象。如果包含了mode形參,則它必須為"r"(默認(rèn)值)或"w"。pwd為用于解密已加密Zip文件的密碼。

open()也是一個(gè)上下文 管理器,因此支持with語句:

with ZipFile('spam.zip') as myzip:

? ? with myzip.open('eggs.txt') as myfile:

? ? print(myfile.read())

如果mode為“r”則文件類對象(ZipExtFile)將只讀并且提供下列方法:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__()。這些對象可獨(dú)立于ZipFile進(jìn)行操作。

如果mode='w'則返回一個(gè)可寫入的文件句柄,它將支持write()方法。當(dāng)一個(gè)可寫入的文件句柄被打開時(shí),嘗試讀寫ZIP文件中的其他文件將會引發(fā)ValueError。

當(dāng)寫入一個(gè)文件時(shí),如果文件大小不能預(yù)先確定但是可能超過2GiB,可傳入force_zip64=True以確保標(biāo)頭格式能夠支持超大文件。如果文件大小可以預(yù)先確定,則在構(gòu)造ZipInfo對象時(shí)應(yīng)設(shè)置file_size,并將其作name形參。

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

從歸檔中提取一個(gè)成員放入當(dāng)前工作目錄;member必須為成員的完整名稱或ZipInfo對象。成員的文件信息會盡可能精確地被提取。path指定一個(gè)要提取到的不同目錄。member可以是一個(gè)文件名或ZipInfo對象。pwd是用于解密文件的密碼。返回所創(chuàng)建的經(jīng)正規(guī)化的路徑(對應(yīng)于目錄或新文件)。

注解:如果一個(gè)成員文件名為絕對路徑,則將去掉驅(qū)動器/UNC共享點(diǎn)和前導(dǎo)的(反)斜杠,例如:?///foo/bar?在 Unix 上將變?yōu)?foo/bar,而?C:\foo\bar?在 Windows 上將變?yōu)?foo\bar。 并且一個(gè)成員文件名中的所有?".."?都將被移除,例如:?../../foo../../ba..r?將變?yōu)?foo../ba..r。 在 Windows 上非法字符 (:,?<,?>,?|,?",??, and?*) 會被替換為下劃線 (_)


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

從歸檔中提取出所有成員放入當(dāng)前工作目錄。path指定一個(gè)要提取到的不同的目錄。members為可選項(xiàng)且必須為namelist()所返回列表的一個(gè)子集。pwd是用于解密文件的密碼。

警告:絕不要未經(jīng)預(yù)先檢驗(yàn)就從不可靠的源中提取歸檔文件。 這樣有可能在?path?之外創(chuàng)建文件,例如某些成員具有以?"/"?開始的文件名或帶有兩個(gè)點(diǎn)號?".."?的文件名。 此模塊會嘗試防止這種情況。 參見?extract()?的注釋。

ZipFile.printdir()

將歸檔是目錄表打印到sys.stdout.

ZipFile.setpassword(pwd)

設(shè)置pwd為用于提取已加密文件的默認(rèn)密碼。

ZipFile.read(name,pwd=None)

返回歸檔中文件name的字節(jié)數(shù)據(jù)。name是歸檔中文件的名稱,或是一個(gè)ZipInfo對象。歸檔必須以讀取或追加方式打開。pwd為用于已加密文件的密碼,并且如果指定該參數(shù)則它將覆蓋通過setpassword()設(shè)置的默認(rèn)密碼。 on a ZipFile that uses a compression method 在使用?ZIP_STORED?,?ZIP_DEFLATED,?ZIP_BZIP2?或?ZIP_LZMA?以外的壓縮方法的 ZipFile 上調(diào)用?read()?將引發(fā)?NotImplementedError。 如果相應(yīng)的壓縮模塊不可用也會引發(fā)錯(cuò)誤。

ZipFile.testzip()

讀取歸檔中的所有文件并檢查他們的CRC和文件頭。返回第一個(gè)已損壞文件的名稱,在其他情況下則返回None。

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

將名為filename的文件寫入歸檔,給予的歸檔名為arcname(默認(rèn)情況下將與filename一致,但是不帶驅(qū)動器盤符并會移除開頭的路徑分隔符)。compress_type如果給出,它將覆蓋作為構(gòu)造器compression形參對于新條目所給出的值。類似地,compresslevel如果給出也將覆蓋構(gòu)造器。歸檔必須使用"w","x“或"a"模式打開。

ZipFile.writestr(zinfo_or_arcname,?data,?compress_type=None,?compresslevel=None)

將一個(gè)文件寫入歸檔。 內(nèi)容為?data,它可以是一個(gè)?str?或?bytes?的實(shí)例;如果是?str,則會先使用 UTF-8 進(jìn)行編碼。?zinfo_or_arcname?可以是它在歸檔中將被給予的名稱,或者是?ZipInfo?的實(shí)例。 如果它是一個(gè)實(shí)例,則至少必須給定文件名、日期和時(shí)間。 如果它是一個(gè)名稱,則日期和時(shí)間會被設(shè)為當(dāng)前日期和時(shí)間。 歸檔必須以?'w',?'x'?或?'a'?模式打開。

ZipFile.filename()

ZIP文件的名稱

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容