Основываясь на ответе Jia103, я разработал функцию (используя Python 2.7.14), которая сохраняет даты каталогов и файлов ПОСЛЕ того, как все было извлечено. Это изолирует любое уродство в функции, и вы также можете использовать zipfile.Zipfile.extractAll () или любой другой метод извлечения zip:
import time
import zipfile
import os
# Restores the timestamps of zipfile contents.
def RestoreTimestampsOfZipContents(zipname, extract_dir):
for f in zipfile.ZipFile(zipname, 'r').infolist():
# path to this extracted f-item
fullpath = os.path.join(extract_dir, f.filename)
# still need to adjust the dt o/w item will have the current dt
date_time = time.mktime(f.date_time + (0, 0, -1))
# update dt
os.utime(fullpath, (date_time, date_time))
Чтобы сохранить даты, просто вызовите эту функцию после завершения извлечения.
Вот пример, из сценария, который я написал для zip / unzip каталогов сохранения игр:
z = zipfile.ZipFile(zipname, 'r')
print 'I have opened zipfile %s, ready to extract into %s' \
% (zipname, gamedir)
try: os.makedirs(gamedir)
except: pass # Most of the time dir already exists
z.extractall(gamedir)
RestoreTimestampsOfZipContents(zipname, gamedir) #<-- USED
print '%s zip extract done' % GameName[game]
Спасибо всем за ваши предыдущие ответы!