創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2017年10月28日 星期六

Python zipfile模組

zipfile是Python內建標準庫提供做壓縮與解壓縮用的。

它目前不支援多磁片壓縮,支援加密ZIP的解密,但尚不支援加密。壓縮方法有保存(無壓縮), PKZIP, BZIP2, LZMA 。雖然功能並不算很齊全,但可以應付大多數的使用情況,而且它的使用方式也相當簡單。

本文簡單展示zipfile的部分用法。

壓縮

本範例假定要把 ~/sample_txt/ 目錄裡 *.txt 檔案壓縮到一個PKZIP檔案中,壓縮檔中也包含 sample_txt 目錄。為方便展示,在代碼中把函式的參數名稱也加上。

import os
from glob import glob
from zipfile import ZipFile, ZIP_DEFLATED

dir_name = 'sample_txt'
src_path = os.path.expanduser(os.path.join('~', dir_name))

with ZipFile('archive.zip', mode='w', compression=ZIP_DEFLATED) as z:
    for x in glob(os.path.join(src_path, '*.txt')):
        print('壓縮加入:' + x)
        z.write(x, arcname=os.path.join(dir_name, os.path.basename(x)))
此處write()中arcname參數的作用是讓*.txt放入壓縮檔中的sample_txt目錄下。

注意並比較一下 with open('filename') as f: 的語法,就會發現兩者的寫法很相似,所以基本上若會寫 with open(),就差不多知道怎麼用zipfile壓縮檔案了。

若想用7zip壓縮格式,即LZMA,將上述的ZIP_DEFLATED改成ZIP_LZMA,並把archive.zip改成archive.7z即可。

LZMA是Python 3.3開始加入的,在那之前若想在Python使用這壓縮法,就要另行取得7zip的執行檔,自行依7zip的指令語法建構壓縮指令,再利用os.system()或是subprocess.call()來執行該指令。雖然當時也可找到第三方的LZMA函式庫,像pylzma,但選擇用這變通的方式在當時可讓我省事些,而且這方式也可適用於使用RAR或其它私有格式做壓縮。

解壓縮

承上例,解壓縮archive.zip:

with ZipFile('archive.zip', mode='r') as z:
    z.extractall()
extractall()有個path參數,就是解壓縮的目的路徑,這裡沒設,就解壓在本程式所在目錄下。

其他

Python標準庫中所提供的資料壓縮與封存的模組有數種,初學者不必每個都去學,挑個易上手的先用,有必要時再去查要用到的部分即可。而且這幾個模組大多有相關,會了其中一個,它可能也涵蓋了其他模組的壓縮格式,這樣就有可能可以省去學習其他模組的時間與精神。像zipfile就有點這樣的性質,而且也是其中相當方便易用的一種。

這裡只展示了簡單的用法,詳情可見The Python Standard Library中的Data Compression and Archiving。像裡頭提供的shutil的make_archive()與unpack_archive()其實也很方便。

沒有留言:

張貼留言