如何在Python中设置文件的最后修改时间?

104

我有一个使用ftplib下载FTP文件的Python脚本。

我的当前下载代码与ftp库文档中的示例完全相同:

ftp.retrbinary('RETR README', open('README', 'wb').write)

现在我有一个要求,下载的文件需要与FTP服务器上的文件具有相同的最后修改时间。假设我可以从 ftp.retrlines('list') 中解析出时间,那么如何设置下载文件的修改时间呢?

如果这很重要,我使用的是基于Unix的操作系统。

3个回答

112

11
这个答案可以通过提供一个示例和讨论那个时间格式的方式来改进;特别是一个时代;例如@jossef的回答。 - Tommy
这在Windows上不适用于1980年之前的日期,对吗?(你为什么想在1980年之前设置修改日期呢?因为当我拖动文件时,Google照片就是这样使用的)。 - Rivers Cuomo
实际上,我认为在1980年之前的日期的值已经设置了。只是在Windows文件浏览器中查看时为空白。 - Rivers Cuomo

45

要编辑文件的最后修改时间字段,请使用:

os.utime(<file path>, (<access date epoch>, <modification date epoch>))

示例:

os.utime(r'C:\my\file\path.pdf', (1602179630, 1602179630))

- Epoch是自1970年1月1日以来已经流逝的秒数。 了解更多


如果您正在寻找一个datetime版本:

import datetime
import os

def set_file_last_modified(file_path, dt):
    dt_epoch = dt.timestamp()
    os.utime(file_path, (dt_epoch, dt_epoch))

# ...

now = datetime.datetime.now()
set_file_last_modified(r'C:\my\file\path.pdf', now)

- 对于 Python 版本 < 3.3,请使用 dt_epoch = time.mktime(dt.timetuple())


3
谢谢你的回答,它包含了例子,详细且有帮助。 - Tommy
2
这本应该是答案,但已经晚了8年。 - albusSimba

21

有两种方法可以做到这一点。其中一种是os.utime示例,如果您要设置没有引用统计信息的文件的时间戳,则需要使用此方法。

但是,如果您正在使用shutil.copy()复制文件,则有一个参考文件。然后,如果您想要复制权限位、上次访问时间、上次修改时间和标志,可以在shutil.copy()之后立即使用shutil.copystat()

还有一个shutil.copy2函数,旨在同时完成这两个步骤...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接