情景:在使用python复制文件或者解压zip文件时,文件的修改时间总是被搞成了当前的执行时间,这样有时会让人挺蛋疼的。
解压并保留原修改时间:
import zipfile
# 发布函数
def deploy():
# 发布单号
order_code = sys.argv[1]
# 解压到当前目录,要包含根目录
deploy_file_zip = os.path.join(source_path, order_code+".zip")
f = zipfile.ZipFile(deploy_file_zip,'r')
#for file in f.namelist():
# f.extract(file,source_path)
# 获取解压后根目录
app_root_dir = f.namelist()[0][:-1]
# 保留原修改时间
for file in f.infolist():
# 先获取原文件的时间
d = file.date_time
gettime = "%s/%s/%s %s:%s" % (d[0], d[1], d[2], d[3], d[4])
# 先解压文件
f.extract(file, source_path)
# 获取解压后文件的绝对路径
filep = os.path.join(source_path, file.filename)
timearry = time.mktime(time.strptime(gettime, '%Y/%m/%d %H:%M'))
# 设置解压后的修改时间(这里把修改时间与访问时间设为一样了,windows系统)
os.utime(filep, (timearry, timearry))
..........
复制保留文件原修改时间:
import os
import shutil
from stat import ST_ATIME, ST_CTIME, ST_MTIME
# 合包kcbp_risk
def merge_krisk(souce, dst):
.....
for root, dirs, files in os.walk(update_version_root_krisk):
for f in files:
# 原文件
update_file = os.path.join(root, f)
# 复制文件,如果存在就会覆盖,dst_file为复制后文件
shutil.copy(update_file, dst_file)
# 关键步骤:保留修改时间,ST_MTIME:修改时间,ST_CTIME:文件访问时间,windows下
file_stat = os.stat(update_file)
os.utime(dst_file, (file_stat[ST_CTIME], file_stat[ST_MTIME]))