需要使用到zipfile模組
###讀取zip檔案
隨便乙個zip檔案,我這裡用了bb.zip,就是乙個資料夾bb,裡面有個檔案aa.txt。
import zipfile
# 預設模式r,讀
azip = zipfile.zipfile('bb.zip') # ['bb/', 'bb/aa.txt']
# 返回所有資料夾和檔案
print(azip.namelist())
# # 返回該zip的檔名
print(azip.filename)
# 壓縮檔案裡bb資料夾下的aa.txt
azip_info = azip.getinfo('bb/aa.txt')
# 原來檔案大小
print(azip_info.file_size)
# 壓縮後大小
print(azip_info.compress_size)
# 這樣可以求得壓縮率,保留小數點後兩位
print('壓縮率為'.format(azip_info.file_size/azip_info.compress_size))
可以看到開啟方式並不是想象中的open,而是zipfile。用namelist()
可以返回裡面所有的資料夾和檔案路徑。getinfo
可以獲得某路徑下檔案的資訊,如上。
還能直接讀取壓縮包裡檔案的內容,下面兩種方法得到的結果是一樣的。需要注意的是,讀取出來的資料好像是位元組形式的,解碼成utf-8就好。
# 可以直接讀取裡面的內容, 不過貌似是位元組形式.需要解碼回utf-8.引數也可以傳ziinfo, 如b
a = azip.read('bb/cc.txt').decode('utf-8')
print(a)
# 開啟檔案再讀取,好像比上面麻煩
b = azip.open(azip_info)
print(b.read().decode('utf-8'))
#用完資源後記得主動close
azip.close()
###解壓zip
最為關鍵的功能,一句搞定。預設解壓在當前工作目錄,可以指定解壓目錄。
azip.extractall()
###新建zip檔案
不僅能讀還能寫。新建壓縮包的時候,可以選擇壓縮演算法,比如deflated和lzma
# 新建壓縮包,放檔案進去,若壓縮包已經存在,將覆蓋。可選擇用a模式,追加
azip = zipfile.zipfile('bb.zip', 'w')
# 必須保證路徑存在,將bb件夾(及其下aa.txt)新增到壓縮包,壓縮演算法lzma
azip.write('d:/bb/aa.txt', compress_type=zipfile.zip_lzma)
# 寫入乙個新檔案到壓縮包中,data是該檔案的具體內容,可以是str或者是byte。
# 這裡是新建乙個bb資料夾,其下再新建乙個cc.txt,將hello world寫入到文字中
azip.writestr('bb/cc.txt', data='hello world', compress_type=zipfile.zip_deflated)
# 關閉資源
azip.close()
上面有兩個方法比較類似,注意區分。
最終壓縮包裡會被新增bb資料夾,其下有aa.txt
和cc.txt
###將整個資料夾新增到壓縮包中
如果我們這樣寫,想象著能新增bb資料夾下所有內容到壓縮包中,那就不對了。這樣新增,只會把bb資料夾複製過去,也僅僅如此,裡面的檔案不會新增到壓縮包。最後得到的只是乙個空資料夾。
azip.write(r'd:/bb', compress_type=zipfile.zip_lzma)
那怎麼辦呢?只好遞迴查詢新增了,os.walk
剛好可以幫助我們。
for current_path, subfolders, filesname in os.walk(r'd:\bb'):
print(current_path, subfolders, filesname)
# filesname是乙個列表,我們需要裡面的每個檔名和當前路徑組合
for file in filesname:
# 將當前路徑與當前路徑下的檔名組合,就是當前檔案的絕對路徑
azip.write(os.path.join(current_path, file))
# 關閉資源
azip.close()
正確選用變數,元組中第乙個是當前路徑,而第三個是當前路徑下的檔案,兩者一組合剛好就是檔案的絕對路徑。
這樣就可以實現新增整個資料夾新增到壓縮包了。而且是這些路徑下所有的資料夾和其下的檔案全部新增。也就是說,保留了原資料夾的結構層次。
###shutil新增壓縮包和解壓縮
shuitl模組有個函式,可以方便地新增整個整個資料夾到壓縮包。
# 第乙個引數是歸檔檔案名稱,第二個引數是指定的格式,不僅是支援zip,第三個引數是要壓縮檔案/資料夾的路徑
shutil.make_archive('archive_name', 'zip', r'f:\ide setting')
# shutil.get_archive_formats() 可以檢視支援的格式
當然也可以解壓縮,可指定解壓目錄,否則預設解壓到當前工作目錄。
shutil.unpack_archive(r'd:\bb.zip')
# shutil.get_unpack_formats() 可以檢視支援的格式
python的map和zip操作
如果要將乙個string list轉換成int list list裡每個string都轉成int 比如 python 0 1 2 0,1,2 可以使用 python int x for x in list 或者使用map操作 map func,list 對list裡的每個元素apply func.p...
python如何壓縮新檔案到已有ZIP檔案
要點在於使用python標準庫zipfile建立壓縮檔案時,如果使用 a 模式時,可以追加新內www.cppcns.com容。from zipfile import zipfile from os import listdir from os.path import lsjkkexisfile,is...
python中map 與zip 操作方法
對於map 它的原型是 map function,sequence 就是對序列sequence中每個元素都執行函式function操作。比如之前的a,b,c map int,raw input split 意思就是說把輸入的a,b,c轉化為整數。再比如 a 1 2 3 4 print map lis...