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

2017年11月16日 星期四

Python zipfile模組之二

本文繼〈Python zipfile模組〉之後再談一下zipfile的解壓縮工作。前述那篇的解壓縮只簡單提到extractall(),這用法雖然簡單,但所解壓出來的檔案,它們的檔案修改日期會與原本在壓縮檔中的不同。如果在意這一點,那麼就必須在解壓完成後自行做修改,而這也是本文所要談論的內容。

以下就直接拿一個實際情境當範例來做說明。在此例中,在一個目錄中有許多zip壓縮檔,每個壓縮檔中包含數個檔案,每個壓縮檔在解壓縮時要把其中的檔案放到各自的目錄中,這各自的目錄就以壓縮檔的主檔名做為名稱。解壓縮時要取得每個檔案的修改時間 ,解壓縮完成後就以這時間來設定檔案的修改/存取時間。

直接放上代碼並在後面做說明。為方便展示,把函式中的參數名稱加上。範例程式是放在與壓縮檔相同的目錄中。

import os
import time
from glob import glob
from zipfile import ZipFile


for x in glob('*.zip'):
    base = os.path.basename(x)
    dirname = os.path.splitext(base)[0] + '/'
    if not os.path.exists(dirname):
        print('建立資料夾:' + dirname)
        os.makedirs(dirname, exist_ok=True)
        with ZipFile(base) as z:
            print('解壓縮:' + base)
            zi = z.infolist()
            for i in zi:
                print('>> 正取出 ' + i.filename)
                z.extract(i, path=dirname)
                unzipped_file = os.path.join(dirname, i.filename)
                if os.path.exists(unzipped_file):
                    time_str = '-'.join([str(j) for j in i.date_time])
                    t = time.mktime(time.strptime(time_str, '%Y-%m-%d-%H-%M-%S'))
                    os.utime(unzipped_file, times=(t, t))

infolist()可取得壓縮檔資訊的列表,其中有檔案名稱(filename)與日期時間(date_time)。

extract()則是解壓縮一個檔案。

最後要設定檔案的修改/存取時間,使用os.utime()。

由infolist()所取得的date_time是6個值的tuple,即(年, 月, 日, 時, 分, 秒),轉成日期時間字串,再轉成utime()所需要的格式,它是9個值的tuple。這麼做可免去自行處理另3個值。

詳細情形可見以下參考。

參考

  • https://docs.python.org/3/library/zipfile.html
  • https://docs.python.org/3/library/time.html
  • https://docs.python.org/3/library/os.html

沒有留言:

張貼留言