328 python操作Zip檔案

2021-08-21 09:56:48 字數 2983 閱讀 6146

需要使用到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.txtcc.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...