Answers:
以跨平台的方式获取某种修改日期很容易-只需调用,便会获得文件在以下位置时的Unix时间戳。os.path.getmtime(path)
path
最后修改时间。
另一方面,获取文件创建日期是不固定的,且取决于平台,即使在三个大型操作系统之间也有所不同:
ctime
(在https://msdn.microsoft.com/zh-cn/library/14h5k7ff.aspx中记录)。您可以通过os.path.getctime()
或通过.st_ctime
调用的结果属性在Python中进行访问os.stat()
。在Unix 上一次更改文件的属性或内容的 Unix上,这将不起作用。ctime
.st_birthtime
调用结果的属性os.stat()
。在Linux上,当前是不可能的,至少没有为Python编写C扩展。尽管一些Linux常用的文件系统确实存储了创建日期(例如,ext4
将它们存储在中st_crtime
),但是Linux内核无法提供访问它们的方法;特别是从stat()
最新的内核版本开始,它从C中的调用返回的结构不包含任何创建日期字段。您还可以看到,该标识符st_crtime
当前在Python源代码中没有显示。至少在打开时ext4
,数据会附加到文件系统中的inode上,但是没有方便的访问方法。
在Linux上,第二好的事情是mtime
通过结果的任os.path.getmtime()
一.st_mtime
属性或属性访问文件的os.stat()
。这将为您提供最后一次修改文件内容的时间,这对于某些用例可能已经足够。
综上所述,跨平台代码应如下所示:
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
ext4
在Linux下的驱动器上访问此数据的方法,并且我想了解当Linux读取Windows编写的文件(反之亦然)时发生的情况,因为它们使用的方式st_ctime
不同。
"w"
,它不会替换它,只会打开现有文件并将其截断。即使文件内容与创建时的内容完全无关,您仍然会被告知文件是在当前版本之前“创建”的。反之,在保存时使用原子替换的编辑器(原始文件被新的进行中的临时文件替换)将显示更新的日期,即使您只是删除了一个字符也是如此。使用修改时间,不要浪费创建时间。
stat.st_ctime
更为相关,因为在许多情况下,最后一次元数据更改的时间可以是创建时间(至少比ctime
实际创建时间短mtime
)。因此,您只需将替换为即可stat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
。你怎么看?干杯
ctime
应始终等于或更高版本比mtime
,因为mtime
变化会导致一个ctime
变化(因为mtime
本身被认为是“元数据”)。请参阅stackoverflow.com/a/39521489/1709587,其中提供了一些示例代码来说明这一点。
您有两种选择。首先,您可以使用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通过提供指向有趣的博客文章的链接使评论中的事实更加清楚)
ctime
每次更新都会更新一次mtime
(因为“ mtime
是元数据”),因此,ctime
通常总是等于或领先于mtime
。治疗ctime
为“创造”的时间从而根本是没有意义的。-1!
Last modified: Fri Jan 31 11:08:13 2020
而 Created: Fri Jan 31 11:08:13 2020
在Linux操作系统Ubuntu 16.04!
time.ctime(os.path.getmtime(file))
返回2种类型的字符串,具体取决于文件是由系统还是由用户修改的。如果已被系统修改,则该字符串在月份和日期之间将有2个空格。我不知道为什么
最好的功能是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)
getmtime
是Unix上最接近的东西(无法获得创建日期),但绝对不是Windows上使用的最佳功能,因为Windows ctime
是创建时间。
os.stat https://docs.python.org/2/library/stat.html#module-stat
编辑:在较新的代码中,您可能应该使用os.path.getmtime()(感谢Christian Oudard),
但请注意,它返回的time_t浮点值只有小数秒(如果您的操作系统支持)
os.path.getmtime()
自从Python 1.5.2(见旧文档)问世以来,它就已经存在了,它是在我失去大部分乳齿之前以及大约在您编写此答案的原始版本之前十年发布的。
有两种获取mod时间的方法,os.path.getmtime()或os.stat(),但是ctime不是可靠的跨平台(请参见下文)。
getmtime(path)返回路径
的最后修改时间。返回值是一个数字,给出自纪元以来的秒数(请参见时间模块)。如果文件不存在或不可访问,请引发os.error。1.5.2版中的新功能。在版本2.3中进行了更改:如果os.stat_float_times()返回True,则结果为浮点数。
stat(path)
在给定路径上执行stat()系统调用。返回值是一个对象,其属性与stat结构的成员相对应,即:st_mode(保护位),st_ino(索引节点号),st_dev(设备),st_nlink(硬链接数),st_uid(所有者的用户ID) ),st_gid(所有者的组ID),st_size(文件大小,以字节为单位),st_atime(最新访问时间),st_mtime(最新内容修改时间),st_ctime(取决于平台;最新元数据更改的时间)在Unix上,或在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。
在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)
有关os.stat_result
所含内容的更多信息,请参阅文档。对于您想要的修改时间fname.stat().st_mtime
:
>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> 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)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
本文提供了有关pathlib模块的更多有用信息和示例。
os.stat
返回具有st_mtime
和st_ctime
属性的命名元组。修改时间st_mtime
在两个平台上都一样;不幸的是,在Windows上ctime
表示“创建时间”,而在POSIX上表示“更改时间”。我不知道有什么方法可以在POSIX平台上获得创建时间。
dir(..)
其中一个。例如dir(os.stat(os.listdir('.')[0]))
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
如果遵循符号链接并不重要,则也可以使用os.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
值得一看的是该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
debugfs
在Linux上使用,从定义上来说,它是不稳定的,需要对所有内容进行顶级root访问,并且几乎每个方面都倾向于是您母亲经常警告您的事情之一。(但是,是的,如果您真的很绝望并且碰巧是没有安全启动的系统上的真正超级用户,它可能会起作用...)
os.stat
确实包括创建时间。对于os.stat()
包含时间的元素,没有st_anything的定义。
所以试试这个:
os.stat('feedparser.py')[8]
将其与您在ls -lah中的文件上的创建日期进行比较
它们应该是相同的。
通过运行系统的stat命令并解析输出,我能够在posix上获得创建时间。
commands.getoutput('stat FILENAME').split('\"')[7]
从终端(OS X)在python外部运行stat返回:
805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt
...其中第四个datetime是文件创建时间(而不是ctime更改时间,如其他注释所述)。