以下就直接拿一個實際情境當範例來做說明。在此例中,在一個目錄中有許多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
沒有留言:
張貼留言