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由於提供了免費的壓縮工具而逐漸在更多的領域得到應用。Microsoft從Windows 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 的資料夾 (其實也不用假設,我還真的有)。
那麼,我可以使用以下 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
- https://docs.python.org/3/library/zipfile.html
- https://pymotw.com/2/zipfile/
- https://www.guru99.com/python-zip-file.html