python模块实例化_python中zipfile模块实例化解析
文章內(nèi)容由--“腳本之家“--提供,在此感謝腳本之家的貢獻(xiàn),該網(wǎng)站網(wǎng)址為:https://www.jb51.net/
簡介:
zipfile是python里用來做zip格式編碼的壓縮和解壓縮的,由于是很常見的zip格式,所以這個模塊使用頻率也是比較高的,
在這里對zipfile的使用方法做一些記錄。即方便自己也方便別人。
Python zipfile模塊用來做zip格式編碼的壓縮和解壓縮的,要進(jìn)行相關(guān)操作,首先需要實例化一個 ZipFile 對象。ZipFile 接受一個字符串格式壓縮包名稱作為它的必選參數(shù),第二個參數(shù)為可選參數(shù),表示打開模式,類似于文件操作,有r/w/a三種模式,分別代表讀、寫、添加,默認(rèn)為r,即讀模式。
zipfile里有兩個非常重要的class, 分別是ZipFile和ZipInfo, 在絕大多數(shù)的情況下,我們只需要使用這兩個class就可以了。ZipFile是主要的類,用來創(chuàng)建和讀取zip文件而ZipInfo是存儲的zip文件的每個文件的信息的。
一、下面我們就來介紹這兩個類的基本操作:
比如要讀取一個Python zipfile 模塊,這里假設(shè)filename是一個文件的路徑:
importzipfile
z=zipfile.ZipFile(filename, 'r')#這里的第二個參數(shù)用r表示是讀取zip文件,w是創(chuàng)建一個zip文件
for f inz.namelist():print f
上面的代碼是讀取一個zip壓縮包里所有文件的名字。z.namelist() 會返回壓縮包內(nèi)所有文件名的列表。
再看看下面一個:
importzipfile
z= zipfile.ZipFile(filename, 'r')for i inz.infolist():print i.file_size, i.header_offset
這里使用了z.infolist(), 它返回的就是壓縮包內(nèi)所有文件的信息,就是一個ZipInfo的列表。一個ZipInfo對象中包含了壓縮包內(nèi)一個文件的信息,其中比較常用的是 filename, file_size, header_offset, 分別為文件名,文件大小,文件數(shù)據(jù)在壓縮包中的偏移。其實之前的z.namelist()就是讀取的ZipInfo中的filename,組成一個 list返回的。
從壓縮包里解壓縮出一個文件的方法是使用ZipFile的read方法:
importzipfile
z= zipfile.ZipFile(filename, 'r')print z.read(z.namelist()[0])
這樣就讀取出z.namelist()中的第一個文件,并且輸出到屏幕,當(dāng)然也可以把它存儲到文件。下面是創(chuàng)建zip壓縮包的方法,與讀取的方法其實很類似的:
importzipfile, os
z= zipfile.ZipFile(filename, 'w')#注意這里的第二個參數(shù)是w,這里的filename是壓縮包的名字
假設(shè)要把一個叫testdir中的文件全部添加到壓縮包里(這里只添加一級子目錄中的文件):
ifos.path.isdir(testdir):for d inos.listdir(testdir):
z.write(testdir+os.sep+d)#close() 是必須調(diào)用的!
z.close()
面的代碼非常的簡單。想想還有一個問題,如果我把一個test/111.txt 添加到壓縮包里之后我希望在包里它放到test22/111.txt怎么辦呢?其實這個就是Python ZipFile模塊的write方法中第二個參數(shù)的作用了。只需要這樣調(diào)用:
z.write("test/111.txt", "test22/111.txt")
二、ZipFile和Zipinfo這兩個類的基本操作
1、class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
創(chuàng)建一個ZipFile對象,表示一個zip文件。參數(shù)file表示文件的路徑或類文件對象(file-like object);參數(shù)mode指示打開zip文件的模式,
默認(rèn)值為'r',表示讀已經(jīng)存在的zip文件,也可以為'w'或'a','w'表示新建一個zip文檔或覆蓋一個已經(jīng)存在的zip文檔,
importzipfile
f= zipfile.ZipFile(filename, 'r') #這里的第二個參數(shù)用r表示是讀取zip文件,w或a是創(chuàng)建一個zip文件
for f_name in f.namelist(): #z.namelist() 會返回壓縮包內(nèi)所有文件名的列表。
print(f_name)#上面的代碼是讀取一個zip壓縮包里所有文件的名字。
'a'表示將數(shù)據(jù)附加到一個現(xiàn)存的zip文檔中。參數(shù)compression表示在寫zip文檔時使用的壓縮方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。如果要操作的zip文件大小超過2G,應(yīng)該將allowZip64設(shè)置為True。
ZipFile還提供了如下常用的方法和屬性:
ZipFile.getinfo(name)
獲取zip文檔內(nèi)指定文件的信息。返回一個zipfile.ZipInfo對象,它包括文件的詳細(xì)信息。
ZipFile.infolist()
獲取zip文檔內(nèi)所有文件的信息,返回一個zipfile.ZipInfo的列表。
ZipFile.namelist()
獲取zip文檔內(nèi)所有文件的名稱列表。
ZipFile.extract(member[, path[, pwd]])
將zip文檔內(nèi)的指定文件解壓到當(dāng)前目錄。參數(shù)member指定要解壓的文件名稱或?qū)?yīng)的ZipInfo對象;參數(shù)path指定了解析文件保存的文件夾;
參數(shù)pwd為解壓密碼。下面一個例子將保存在程序根目錄下的duoduo.zip內(nèi)的所有文件解壓到D:/Work目錄:
importzipfile, os
f= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip')) #拼接成一個路徑
for file inf.namelist():
f.extract(file, r'd:/Work') #在d:/Work中解壓文件
f.close()
上面是os.getcwd的用法!!
ZipFile.extractall([path[, members[, pwd]]])
解壓zip文檔中的所有文件到當(dāng)前目錄。參數(shù)members的默認(rèn)值為zip文檔內(nèi)的所有文件名稱列表,也可以自己設(shè)置,選擇要解壓的文件名稱。
ZipFile.printdir()
將zip文檔內(nèi)的信息打印到控制臺上。
ZipFile.setpassword(pwd)
設(shè)置zip文檔的密碼。
ZipFile.read(name[, pwd])
獲取zip文檔內(nèi)指定文件的二進(jìn)制數(shù)據(jù)。下面的例子演示了read()的使用,zip文檔內(nèi)包括一個duoduo.txt的文本文件,使用read()方法讀取其二進(jìn)制數(shù)據(jù),然后保存到D:/duoduo.txt。
importzipfile, os
zipFile= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip'))
data= zipFile.read('duoduo.txt')#(lambda f, d: (f.write(d), f.close()))(open(r'd:/duoduo.txt', 'wb'), data) #一行語句就完成了寫文件操作。仔細(xì)琢磨哦~_~
with open(r'd:/duoduo.txt','wb') as f:for d indata:
f.write(d)
zipFile.close()
ZipFile.write(filename[, arcname[, compress_type]])
將指定文件添加到zip文檔中。filename為文件路徑,arcname為添加到zip文檔之后保存的名稱, 參數(shù)compress_type表示壓縮方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示了如何創(chuàng)建一個zip文檔,并將文件D:/test.doc添加到壓縮文檔中。
importzipfile, os
zipFile= zipfile.ZipFile(r'D:/test.zip'), 'w')
zipFile.write(r'D:/test.doc', '保存的名字', zipfile.ZIP_DEFLATED)
zipFile.close()
ipFile.writestr(zinfo_or_arcname, bytes)
writestr()支持將二進(jìn)制數(shù)據(jù)直接寫入到壓縮文檔。
2、Class ZipInfo
ZipFile.getinfo(name) 方法返回的是一個ZipInfo對象,表示zip文檔中相應(yīng)文件的信息。它支持如下屬性:
ZipInfo.filename: 獲取文件名稱。
ZipInfo.date_time: 獲取文件最后修改時間。返回一個包含6個元素的元組:(年, 月, 日, 時, 分, 秒)
ZipInfo.compress_type: 壓縮類型。
ZipInfo.comment: 文檔說明。
ZipInfo.extr: 擴(kuò)展項數(shù)據(jù)。
ZipInfo.create_system: 獲取創(chuàng)建該zip文檔的系統(tǒng)。
ZipInfo.create_version: 獲取 創(chuàng)建zip文檔的PKZIP版本。
ZipInfo.extract_version: 獲取 解壓zip文檔所需的PKZIP版本。
ZipInfo.reserved: 預(yù)留字段,當(dāng)前實現(xiàn)總是返回0。
ZipInfo.flag_bits: zip標(biāo)志位。
ZipInfo.volume: 文件頭的卷標(biāo)。
ZipInfo.internal_attr: 內(nèi)部屬性。
ZipInfo.external_attr: 外部屬性。
ZipInfo.header_offset: 文件頭偏移位。
ZipInfo.CRC: 未壓縮文件的CRC-32。
ZipInfo.compress_size: 獲取壓縮后的大小。
ZipInfo.file_size: 獲取未壓縮的文件大小。
下面一個簡單的例子說明這些屬性的意思:
importzipfile, os
zipFile= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip'))
zipInfo= zipFile.getinfo('文件中的文件.txt')print ('filename:', zipInfo.filename) #獲取文件名稱
print ('date_time:', zipInfo.date_time) #獲取文件最后修改時間。返回一個包含6個元素的元組:(年, 月, 日, 時, 分, 秒)
print ('compress_type:', zipInfo.compress_type) #壓縮類型
print ('comment:', zipInfo.comment) #文檔說明
print ('extra:', zipInfo.extra) #擴(kuò)展項數(shù)據(jù)
print ('create_system:', zipInfo.create_system) #獲取創(chuàng)建該zip文檔的系統(tǒng)。
print ('create_version:', zipInfo.create_version) #獲取 創(chuàng)建zip文檔的PKZIP版本。
print ('extract_version:', zipInfo.extract_version) #獲取 解壓zip文檔所需的PKZIP版本。
print ('extract_version:', zipInfo.reserved) #預(yù)留字段,當(dāng)前實現(xiàn)總是返回0。
print ('flag_bits:', zipInfo.flag_bits) #zip標(biāo)志位。
print ('volume:', zipInfo.volume) #文件頭的卷標(biāo)。
print ('internal_attr:', zipInfo.internal_attr) #內(nèi)部屬性。
print ('external_attr:', zipInfo.external_attr) #外部屬性。
print ('header_offset:', zipInfo.header_offset) #文件頭偏移位。
print ('CRC:', zipInfo.CRC) #未壓縮文件的CRC-32。
print ('compress_size:', zipInfo.compress_size) #獲取壓縮后的大小。
print ('file_size:', zipInfo.file_size) #獲取未壓縮的文件大小。
zipFile.close() #
三、python使用內(nèi)存zipfile對象在內(nèi)存中打包文件示例
importzipfileimportStringIOclassInMemoryZip(object):def __init__(self):#Create the in-memory file-like object
self.in_memory_zip =StringIO.StringIO()defappend(self, filename_in_zip, file_contents):'''Appends a file with name filename_in_zip and contents of
file_contents to the in-memory zip.'''
#Get a handle to the in-memory zip in append mode
zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)#Write the file to the in-memory zip
zf.writestr(filename_in_zip, file_contents)#Mark the files as having been created on Windows so that
#Unix permissions are not inferred as 0000
for zfile inzf.filelist:
zfile.create_system=0returnselfdefread(self):'''Returns a string with the contents of the in-memory zip.'''self.in_memory_zip.seek(0)returnself.in_memory_zip.read()defwritetofile(self, filename):'''Writes the in-memory zip to a file.'''f= file(filename, "w")
f.write(self.read())
f.close()if __name__ == "__main__":#Run a test
imz =InMemoryZip()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Python讀zip文件
下面的代碼給出了用Python讀取zip文件,打印出壓縮文件里面所有的文件,并讀取壓縮文件中的第一個文件。
importzipfile
z= zipfile.ZipFile("zipfile.zip", "r")#打印zip文件中的文件列表
for filename inz.namelist( ):print 'File:', filename#讀取zip文件中的第一個文件
first_file_name =z.namelist()[0]
content=z.read(first_file_name)printfirst_file_nameprint content
Python寫/創(chuàng)建zip文件
Python寫Zip文件主要用到ZipFile的write函數(shù)。
importzipfile
z= zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)
z.write('test.html')
z.close( )
在創(chuàng)建ZipFile實例的時候,有2點藥注意:
1.要用'w'或'a'模式,用可寫的方式打開zip文件
2.壓縮模式有ZIP_STORED 和 ZIP_DEFLATED,ZIP_STORED只是存儲模式,不會對文件進(jìn)行壓縮,這個是默認(rèn)值,如果你需要對文件進(jìn)行壓縮,必須使用ZIP_DEFLATED模式。
四、python破解zip加密文件的方法
首先我們先來桌面創(chuàng)建一個文件
我們創(chuàng)建了一個名為q的txt文件然后我們將它壓縮,壓縮的時候記得設(shè)置上密碼
我這邊將密碼設(shè)置為123456
使用python的zipfile的模塊,編寫zip文件口令破解機。需要用到 Zip File類中的 extractall方法。這個類和這個方法對我們編程破解有口令保護(hù)的Zip文件是很有用的。請注意 extractant(方法用可選參數(shù)指定密碼的方式。
導(dǎo)入庫后,用帶有口令保護(hù)的Zip文件的文件名,實例化一個新的 Zipfile類。要解壓這個Zip文件,我們使用 extractall方法,并在可選參數(shù)pwd上填入口令。
創(chuàng)建一個.py文件,在根目錄然后在將我們的壓縮文件放入同目錄里面,項目結(jié)構(gòu)目錄:
我們.py文件的代碼:
importzipfile
zipFile= zipfile.ZipFile("q.zip","r")//這里是我們的壓縮文件
zipFile.extractall(pwd="123456")//這里是我們的密碼
這段代碼其實就是拿著密碼去解壓我們剛剛壓縮的文件,網(wǎng)上大多數(shù)教程都是這樣寫的,但是我這邊使用python3.6就會發(fā)現(xiàn)運行的時候報錯了:
反正錯誤大概的意思就是pwd的接收的數(shù)據(jù)應(yīng)該是bytes類型但是它得到的卻是str類型的反正就是類型錯了,那我們就將密碼轉(zhuǎn)換為bytes類型,我們的py文件的代碼如下:
我們可以看到在我們的項目根目錄下多了一個文件就是我們之前壓縮的那個文件
接下來我們繼續(xù)改造,如果用一個錯誤密碼執(zhí)行這個腳本會發(fā)生什么情況?讓我們在腳本中增加一些捕獲和處理異常的代碼,顯示錯誤的信息。
importzipfile
zipFile= zipfile.ZipFile("q.zip","r")try:
password= '123s456'zipFile.extractall(pwd=str.encode(password))exceptException as ex:print(ex)
這時候我們的py文件代碼,并且我們還將密碼故意寫錯來測試一下,來看一下運行結(jié)果
在這里我們可以看到錯誤 信息,就是告訴我們密碼錯誤
我們可以用因口令不正確而拋出的異常來測試我們的字典文件(接下來的zidian.text)中是否有Zip文件的口令。實例化一個 Zip File類之后,我們打開字典文件,遍歷并測試字典中的每個單詞。如果 extractall0函數(shù)的執(zhí)行沒有出錯,則打印一條消息,輸出正確的口令。但是,如果 extractall()函數(shù)拋出了一個口令錯誤的異常,就忽略這個異常,并繼續(xù)測試字典中的下一個口令。
我們先創(chuàng)建一個zidian.text文件
接下來我們在zidian.text文件中編寫我們的密碼字典,每一行一個密碼,紅色部分是我們的正確密碼
然后將我們的密碼字典放入項目中
接著我們繼續(xù)修改我們的腳本
zipFile = zipfile.ZipFile("q.zip","r")#打開我們的字典表
passFile = open('zidian.txt')for line inpassFile.readlines():#讀取每一行數(shù)據(jù)(每一個密碼)
password = line.strip('\n')try:
zipFile.extractall(pwd=str.encode(password))print('=========密碼是:'+password+'\n')#如果密碼正確退出程序
exit(0)exceptException as ex:#跳過
pass
接下來我們看一下運行結(jié)果
哈哈我們已經(jīng)成功破解了zip文件的密碼,到這里我們不難發(fā)現(xiàn)只要我們字典里面有密碼我們就可以破解出來
我們繼續(xù)將我們的項目優(yōu)化一下:
importzipfiledefextractFile(zFile,password):try:
zFile.extractall(pwd=str.encode(password))#如果成功返回密碼
returnpasswordexcept:return
defmain():
zFile= zipfile.ZipFile("q.zip","r")#打開我們的字典表
passFile = open('zidian.txt')for line inpassFile.readlines():#讀取每一行數(shù)據(jù)(每一個密碼)
password = line.strip('\n')
guess=extractFile(zFile,password)if(guess):print("=========密碼是:"+password+"\n")
exit(0)if __name__=='__main__':
main()
這樣就好多了!
接下來再給大家貼一個生成全部六位數(shù)數(shù)字密碼的代碼:
f = open('zidian.txt','w')for id in range(1000000):
password= str(id).zfill(6)+'\n'f.write(password)
f.close()
運行成功后我們可以看到再我們的zidian.txt已經(jīng)生成好了從000000到999999都有了這樣我們只要是6位數(shù)數(shù)字密碼的zip文件我們都可以破解了!
總結(jié)
以上是生活随笔為你收集整理的python模块实例化_python中zipfile模块实例化解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中的音乐播放
- 下一篇: Android简易音乐播放器实现代码