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


当前回答

import os, time, datetime

file = "somefile.txt"
print(file)

print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))

print()

print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))

print()

modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

print()

created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

打印

somefile.txt
Modified
1429613446
1429613446.0
1429613446.0

Created
1517491049
1517491049.28306
1517491049.28306

Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46

Date created: Thu Feb  1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29

注意:在Linux上文件的ctime与在Windows上略有不同。 Windows用户把他们的时间称为“创建时间”。 Linux用户把他们的时间称为“改变时间”。

其他回答

操作系统。Stat返回一个带有st_mtime和st_ctime属性的命名元组。在两个平台上,修改时间为st_mtime;不幸的是,在Windows中,ctime意味着“创建时间”,而在POSIX中它意味着“更改时间”。我不知道有什么方法可以在POSIX平台上获得创建时间。

有两个方法可以获得mod时间,os.path.getmtime()或os.stat(),但ctime跨平台不可靠(见下文)。

os.path.getmtime()

getmtime(路径) 返回最后一次修改路径的时间。返回值是一个给出 自epoch开始的秒数(请参阅time模块)。提高操作系统。如果文件存在,则错误 不存在或无法访问。1.5.2新版功能。在2.3版更改:如果 os.stat_float_times()返回True,结果是一个浮点数。

os.stat()

stat(path) Perform a stat() system call on the given path. The return value is an object whose attributes correspond to the members of the stat structure, namely: st_mode (protection bits), st_ino (inode number), st_dev (device), st_nlink (number of hard links), st_uid (user ID of owner), st_gid (group ID of owner), st_size (size of file, in bytes), st_atime (time of most recent access), st_mtime (time of most recent content modification), st_ctime (platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows):

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

在上面的例子中,您将使用statinfo。St_mtime或statinfo。St_ctime分别获取mtime和ctime。

你有几个选择。首先,你可以使用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在评论中提供了一个有趣的博客文章链接,使这一事实更加明确。)

在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模块提供了更多有用的信息和示例。

如果下列符号链接不重要,也可以使用操作系统。lstat内置命令。

>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0