? ? Zip文件格式是通用的文檔壓縮標(biāo)準(zhǔn)痰腮。自1.6版本起埃元,Python中zipfile模塊能夠直接處理zip文件里的數(shù)據(jù)氢哮,例如需要將對(duì)應(yīng)目錄或多個(gè)文件打包或壓縮成zip格式葛圃,或者需要查看一個(gè)zip格式的歸檔文件中部分或者所有文件同時(shí)避免講這些文件展開到磁盤上。使用ZipFile類來操作zip文件此虑。
創(chuàng)建一個(gè)ZipFile對(duì)象甚纲,表示一個(gè)zip文件朦前。
? ??參數(shù)file:文件的路徑或者類似文件對(duì)象
? ??參數(shù)mode:讀"r",寫入"w",添加"a"
? ??參數(shù)compression: ZIP_STORED(無壓縮),ZIP_DEFLATED(壓縮贩疙,需要zlib支持)
? ??參數(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文檔中
? ??參數(shù)filename:需要寫入文件的路徑
? ??參數(shù)arcname:文件寫入ZIP文檔后保存的文件名
? ??參數(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類的對(duì)象癞尚。
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()否則將不會(huì)寫入關(guān)鍵記錄數(shù)據(jù)乱陡。
ZipFile.getinfo(name)
返回一個(gè)ZipInfo對(duì)象浇揩,其中包含有關(guān)歸檔成員name的信息。針對(duì)一個(gè)目前并不包含于歸檔中的名稱調(diào)用getinfo()將會(huì)引發(fā)KeyError憨颠。
ZipFile.infolist()
? ?返回一個(gè)列表胳徽,其中包含每個(gè)歸檔成員的ZipInfo對(duì)象。如果是打開一個(gè)現(xiàn)有歸檔則這些對(duì)象的排列順序與他們對(duì)于條目在磁盤上的實(shí)際ZIP文件中的順序一致爽彤。
ZipFile.namelist()
返回按名稱排列的歸檔成員列表养盗。
ZipFile.open(name,mode='r',pwd=None,*,force_zip64=False)
以二進(jìn)制文件類對(duì)象的形式訪一個(gè)歸檔成員。name可以是歸檔內(nèi)某個(gè)文件的名稱也可以是某個(gè)ZipInfo對(duì)象适篙。如果包含了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”則文件類對(duì)象(ZipExtFile)將只讀并且提供下列方法:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__()。這些對(duì)象可獨(dú)立于ZipFile進(jìn)行操作硫痰。
如果mode='w'則返回一個(gè)可寫入的文件句柄衩婚,它將支持write()方法。當(dāng)一個(gè)可寫入的文件句柄被打開時(shí)碍论,嘗試讀寫ZIP文件中的其他文件將會(huì)引發(fā)ValueError谅猾。
當(dāng)寫入一個(gè)文件時(shí),如果文件大小不能預(yù)先確定但是可能超過2GiB鳍悠,可傳入force_zip64=True以確保標(biāo)頭格式能夠支持超大文件税娜。如果文件大小可以預(yù)先確定,則在構(gòu)造ZipInfo對(duì)象時(shí)應(yīng)設(shè)置file_size,并將其作name形參藏研。
ZipFile.extract(member,path=None,pwd=None)
從歸檔中提取一個(gè)成員放入當(dāng)前工作目錄敬矩;member必須為成員的完整名稱或ZipInfo對(duì)象。成員的文件信息會(huì)盡可能精確地被提取蠢挡。path指定一個(gè)要提取到的不同目錄弧岳。member可以是一個(gè)文件名或ZipInfo對(duì)象凳忙。pwd是用于解密文件的密碼。返回所創(chuàng)建的經(jīng)正規(guī)化的路徑(對(duì)應(yīng)于目錄或新文件)禽炬。
注解:如果一個(gè)成員文件名為絕對(duì)路徑涧卵,則將去掉驅(qū)動(dòng)器/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?*) 會(huì)被替換為下劃線 (_)
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)號(hào)?".."?的文件名戈锻。 此模塊會(huì)嘗試防止這種情況。 參見?extract()?的注釋却嗡。
ZipFile.printdir()
將歸檔是目錄表打印到sys.stdout.
ZipFile.setpassword(pwd)
設(shè)置pwd為用于提取已加密文件的默認(rèn)密碼舶沛。
ZipFile.read(name,pwd=None)
返回歸檔中文件name的字節(jié)數(shù)據(jù)。name是歸檔中文件的名稱窗价,或是一個(gè)ZipInfo對(duì)象如庭。歸檔必須以讀取或追加方式打開。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)的壓縮模塊不可用也會(huì)引發(fā)錯(cuò)誤帝牡。
ZipFile.testzip()
讀取歸檔中的所有文件并檢查他們的CRC和文件頭往毡。返回第一個(gè)已損壞文件的名稱,在其他情況下則返回None靶溜。
ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)
將名為filename的文件寫入歸檔开瞭,給予的歸檔名為arcname(默認(rèn)情況下將與filename一致,但是不帶驅(qū)動(dòng)器盤符并會(huì)移除開頭的路徑分隔符)罩息。compress_type如果給出嗤详,它將覆蓋作為構(gòu)造器compression形參對(duì)于新條目所給出的值。類似地瓷炮,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,則會(huì)先使用 UTF-8 進(jìn)行編碼淋昭。?zinfo_or_arcname?可以是它在歸檔中將被給予的名稱俐填,或者是?ZipInfo?的實(shí)例。 如果它是一個(gè)實(shí)例响牛,則至少必須給定文件名玷禽、日期和時(shí)間。 如果它是一個(gè)名稱呀打,則日期和時(shí)間會(huì)被設(shè)為當(dāng)前日期和時(shí)間。 歸檔必須以?'w',?'x'?或?'a'?模式打開糯笙。
ZipFile.filename()
ZIP文件的名稱