我有一个脚本,需要根据文件创建和修改日期做一些事情,但必须在 Linux 和 Windows 上运行。
在 Python 中获取文件创建和修改日期 / 时间的最佳跨平台方法是什么?
你有几个选择。首先,您可以使用os.path.getmtime
和os.path.getctime
函数:
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
你的另一个选择是使用os.stat
:
import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))
注意 : ctime()
不是指 * nix 系统上的创建时间,而是上次更改 inode 数据的时间。 (感谢 kojiro 通过提供一个有趣的博客文章的链接在评论中更清楚地说明这一事实)
以跨平台方式获取某种修改日期很简单 - 只需调用os.path.getmtime( <i>path</i> )
,您将获得上次修改path
文件时的 Unix 时间戳。
另一方面,获取文件创建日期是繁琐且依赖于平台的,甚至在三个大型操作系统之间也是如此:
ctime
(记录在https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx )存储其创建日期。您可以通过os.path.getctime()
或者调用os.stat()
的结果的.st_ctime
属性在 Python 中访问它。这不会在 Unix 上,在那里工作ctime
是该文件的属性或内容被改变的最后一次 。 os.stat()
调用结果的.st_birthtime
属性。 在Linux 上 ,目前这是不可能的,至少没有为 Python 编写 C 扩展。虽然一些常用于 Linux 的文件系统会存储创建日期 (例如, ext4
将它们存储在st_crtime
),但 Linux 内核无法访问它们 ; 特别是,它从 C 中的stat()
调用返回的结构,从最新的内核版本开始, 不包含任何创建日期字段 。您还可以看到标识符st_crtime
当前不在Python 源中的任何位置。至少如果你在ext4
,数据会附加到文件系统中的 inode,但没有方便的方法来访问它。
Linux 上的下一个最好的事情是通过os.path.getmtime()
或os.stat()
结果的.st_mtime
属性访问文件的mtime
。这将为您提供文件内容的最后修改时间,这可能适用于某些用例。
总而言之,跨平台代码看起来应该是这样的......
import os
import platform
def creation_date(path_to_file):
"""
Try to get the date that a file was created, falling back to when it was
last modified if that isn't possible.
See http://stackoverflow.com/a/39501288/1709587 for explanation.
"""
if platform.system() == 'Windows':
return os.path.getctime(path_to_file)
else:
stat = os.stat(path_to_file)
try:
return stat.st_birthtime
except AttributeError:
# We're probably on Linux. No easy way to get creation dates here,
# so we'll settle for when its content was last modified.
return stat.st_mtime
用于此的最佳函数是os.path.getmtime() 。在内部,这只使用os.stat(filename).st_mtime
。
datetime 模块是最佳的操作时间戳,因此您可以将修改日期作为datetime
对象获取,如下所示:
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
用法示例:
>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)