在Linux和Windows上获得文件创建和修改日期/时间的最佳跨平台方法是什么?


当前回答

在Python 3.4及以上版本中,您可以使用面向对象的pathlib模块接口,其中包括大部分os模块的包装器。下面是一个获取文件统计信息的示例。

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

有关操作系统的更多信息。Stat_result包含,请参考文档。对于修改时间,你需要fname.stat().st_mtime:

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime, tz=datetime.timezone.utc)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

如果你想要Windows上的创建时间,或者Unix上最新的元数据更改,你可以使用fname.stat().st_ctime:

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime, tz=datetime.timezone.utc)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

本文为pathlib模块提供了更多有用的信息和示例。

其他回答

在Python 3.4及以上版本中,您可以使用面向对象的pathlib模块接口,其中包括大部分os模块的包装器。下面是一个获取文件统计信息的示例。

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

有关操作系统的更多信息。Stat_result包含,请参考文档。对于修改时间,你需要fname.stat().st_mtime:

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime, tz=datetime.timezone.utc)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

如果你想要Windows上的创建时间,或者Unix上最新的元数据更改,你可以使用fname.stat().st_ctime:

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime, tz=datetime.timezone.utc)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

本文为pathlib模块提供了更多有用的信息和示例。

可能值得一看crtime库,它实现了对文件创建时间的跨平台访问。

from crtime import get_crtimes_in_dir

for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_epoch=False):
    print(fname, date)
    # file_a.py Mon Mar 18 20:51:18 CET 2019

os.stat

在更新的代码中,您可能应该使用os.path.getmtime()(谢谢,Christian Oudard)。

但是请注意,它返回一个带分数秒的浮点值time_t(如果您的操作系统支持它)。

操作系统。Stat包含了创建时间。os.stat()中包含时间的元素没有st_anything的定义。

所以试试这个:

os.stat('feedparser.py')[8]

将其与ls -lah文件上的创建日期进行比较

它们应该是一样的。

最好的函数是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)