Python操作Zip檔案

來源:互聯網
上載者:User

標籤:獲得   flat   list()   歸檔   檔案夾複製   mat   extract   第一個   建立檔案夾   

Python操作Zip檔案

需要使用到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.txtazip_info = azip.getinfo(‘bb/aa.txt‘)# 原來檔案大小print(azip_info.file_size)# 壓縮後大小print(azip_info.compress_size)# 這樣可以求得壓縮率,保留小數點後兩位print(‘壓縮率為{:.2f}‘.format(azip_info.file_size/azip_info.compress_size))

可以看到開啟檔案並不是想象中的open,而是ZipFile。用namelist()可以返回裡面所有的檔案夾和檔案路徑。getinfo可以獲得某路徑下檔案的資訊,如上。

還能直接讀取壓縮包裡檔案的內容,下面兩種方法得到的結果是一樣的。需要注意的是,讀取出來的資料好像是位元組形式的,解碼成utf-8就好

# 可以直接讀取裡面的內容, 不過貌似是位元組形式.需要解碼回utf-8.參數也可以傳ZiInfo, 如ba = azip.read(‘bb/cc.txt‘).decode(‘utf-8‘)print(a)# 開啟檔案再讀取,好像比上面麻煩b = azip.open(azip_info)print(b.read().decode(‘utf-8‘))azip.close()

用完資源後記得主動close。

解壓Zip

最為關鍵的功能,一句搞定。預設解壓在當前工作目錄,可以指定解壓目錄。

azip.extractall()
建立Zip檔案

不僅能讀還能寫。建立壓縮包的時候,可以選擇壓縮演算法,比如DEFLATED和LZMA

# 建立壓縮包,放檔案進去,若壓縮包已經存在,將覆蓋。可選擇用a模式,追加azip = zipfile.ZipFile(‘bb.zip‘, ‘w‘)# 必須保證路徑存在,將bb件夾(及其下aa.txt)添加到壓縮包,壓縮演算法LZMAazip.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()

上面有兩個方法比較類似,注意區分。

  • write指的是將已經存在的檔案複製到壓縮包,包括路徑中的所有檔案夾河其下的檔案。
  • writestr是直接在壓縮包裡建立檔案夾和檔案,data參數是往該檔案中寫入的內容。

最終壓縮包裡會被添加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操作Zip檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.