Skip to content

[Python] 使用 zipfile 壓縮、解壓資料夾

Last Updated on 2021-08-03 by Clay

想必大家都對所謂的『壓縮檔』不陌生吧?所謂的壓縮檔,就是我們將一個或多個檔案、資料夾壓縮成一份檔案,這也是所謂的『歸檔』。除了歸檔之外,依照壓縮格式演算法的不同,有些甚至能壓縮檔案的大小,幫助我們更好地儲存、傳送這些檔案。

而若是我們需要將壓縮檔還原回原本的檔案呢?這時候我們就需要依照不同的壓縮格式去進行『解壓縮』,這才能把原先壓縮起來的檔案釋放出來,變成我們可以正常讀取的檔案、資料夾。

今天要紀錄的,就是如何透過 Python 中的 zipfile 模組去進行 ZIP 格式的壓縮與解壓縮。大家可能會想:啊我自己使用電腦上的應用程式自己壓縮、解壓縮就好了呀? —— 這沒說錯,不過雖然透過程式呼叫雖然比直接手動使用軟體麻煩了一點,但卻有著更大的自由度。

比方說,今天若是你程式的專案中需要即時地讀取壓縮檔案,這時候比起預先將全部檔案解壓縮好,不如在程式中打開壓縮檔並讀取裡頭的檔案;比方說,今天你要找尋眾多壓縮檔案裡面的某份特定名稱的檔案,若不用程式查找,則需要一份份地查看壓縮檔 ......

這就是使用程式進行這些工作的好處。雖然麻煩,可是自由度高,可任意客製。

那麼以下,我會簡單介紹 zip 壓縮檔,再介紹 Python 中的 zipfile 模組,並列出簡單的範例程式碼。


簡單介紹 zip 壓縮檔

以下引述一段 WIKI 上的介紹:

ZIP 檔案格式的介紹

ZIP檔案格式是一種資料壓縮和文件儲存的檔案格式,原名Deflate,發明者為菲爾·卡茨(Phil Katz),他於1989年1月公布了該格式的資料。ZIP通常使用字尾名「.zip」,它的MIME格式為application/zip。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放原始碼的7z格式。從效能上比較,RAR及7z格式較ZIP格式壓縮率較高,而7-Zip由於提供了免費的壓縮工具而逐漸在更多的領域得到應用。MicrosoftWindows ME作業系統開始內建對zip格式的支援,即使用戶的電腦上沒有安裝解壓縮軟體,也能開啟和製作zip格式的壓縮檔案,OS X和流行的Linux作業系統也對zip格式提供了類似的支援。因此如果在網路上傳播和分發檔案,zip格式往往是最常用的選擇。

順帶一提,若在 Linux 系統上,可以使用以下指令來壓縮、解壓縮 zip 格式哦。

壓縮: zip -r File.zip File
加密壓縮: zip -rP {dddd} test.zip words.txt
解壓縮: unzip File.zip

如何使用 zipfile 模組

zipfile 是純 Python 實現的,並非由 C 所構成,所以效能可能並不優秀,不推薦用於破解 zip 檔密碼的實作。不過,這個模組實現了創造、讀取、寫入、列表 ...... 種種關於 zip 格式的操作,算是相當完善了。

以下就來看看要如何進行 zipfile 模組的操作吧!


使用 zipfile 進行壓縮

假設我有一個名為 test 的資料夾 (其實也不用假設,我還真的有)。

可以看到,底下存在著 test_01.txt、test_02.txt 兩份文字檔案

那麼,我可以使用以下 Python 程式碼進行壓縮。

# coding: utf-8
import os
import zipfile


# zipfile example
def zip_dir(path):
    zf = zipfile.ZipFile('{}.zip'.format(path), 'w', zipfile.ZIP_DEFLATED)
   
    for root, dirs, files in os.walk(path):
        for file_name in files:
            zf.write(os.path.join(root, file_name))


if __name__ == '__main__':
    path = 'test'
    zip_dir(path)



Output:

可以看到,當前目錄底下出現了我們壓縮之後的 test.zip 壓縮檔。


使用 zipfile 列出壓縮檔內文件

那麼,如果要查找大量 zip 壓縮檔內的文件,可以參考下方範例程式碼:

# coding: utf-8
import os
import zipfile


# zipfile example
def zip_list(file_path):
    zf = zipfile.ZipFile(file_path, 'r')
    print(zf.namelist())


if __name__ == '__main__':
    file_path = 'test.zip'
    zip_list(file_path)



Output:

['test/test_01.txt', 'test/test_02.txt']


使用 zipfile 解壓縮

如果要解壓縮資料夾,我們可以先將壓縮檔使用 zipfile 讀取,並使用 extractall() 函式解壓縮。

# coding: utf-8
import os
import zipfile


# zipfile example
def zip_list(file_path):
    zf = zipfile.ZipFile(file_path, 'r')
    zf.extractall()


if __name__ == '__main__':
    file_path = 'test.zip'
    zip_list(file_path)



這樣一來就會看到我們解壓縮後的資料夾了。


References


Read More

Leave a Reply