How to get file creation & modification date/times in Python?
我有一个脚本需要根据文件创建和修改日期做一些事情,但必须在Linux和Windows上运行。
在python中获得文件创建和修改日期/时间的最佳跨平台方法是什么?
你有几的选择。一,你可以使用
1 2 3 | import os.path, time print("last modified: %s" % time.ctime(os.path.getmtime(file))) print("created: %s" % time.ctime(os.path.getctime(file))) |
您的其他选择是使用
1 2 3 | import os, time (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file) print("last modified: %s" % time.ctime(mtime)) |
注:
以跨平台的方式获取某种修改日期很容易——只需调用
另一方面,获取文件创建日期非常复杂,而且依赖于平台,这三大操作系统之间甚至存在差异:
- 在Windows上,文件的
ctime 存储其创建日期(文档位于https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx)。您可以通过调用os.stat() 的结果的os.path.getctime() 或.st_ctime 属性在python中访问它。这在Unix上不起作用,因为ctime 是最后一次更改文件属性或内容。 - 在Mac和其他一些基于Unix的操作系统上,您可以使用调用
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 。这将为您提供最后一次修改文件内容的时间,这对于某些用例可能是足够的。
把这些放在一起,跨平台代码应该看起来像这样…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(使用)。在内部,这
这是最好的manipulating datetime模块时间戳,这样你可以得到的修改对象的日期作为一
1 2 3 4 5 | import os import datetime def modification_date(filename): t = os.path.getmtime(filename) return datetime.datetime.fromtimestamp(t) |
使用的例子:
1 2 3 4 5 | >>> 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) |
os.stat http:/ / / 2 /图书馆/ stat.html docs.python.org #模块统计
编辑:你应该在使用更新的代码可能是(我)oudard os.path.getmtime(基督教)但注意,它返回a浮点值时_ t秒(如果你的操作系统的一部分,支持它)
有两个方法得到的模型时,os.path.getmtime()或(),但os.stat CTime是不可靠的跨平台(见下面)。
os.path.getmtime()
getmtime
(路径)返回最后修改的时间路径。返回值是一个数给酒店自从数秒(湖)的时间模块)。如果该文件是os.error逆境或是无法存在的。新版本中的不同。2.3版本:如果死os.stat _浮_时报()返回TRUE,返回的结果是一个的浮点数。
os.stat()
stat(路径)
stat()系统调用执行一个给定的路径。返回值是一个对象的信息风格指南的成员属性的统计结构,即:圣_(保护模式位)、ST(inode number),_鲍圣_ dev(装置)、ST(_ nlink硬链接数)、ST _ UID(所有者的用户ID(GID)、ST(集团_ ID of owner)、ST(_文件尺寸大小,以字节为单位)时间(时间(ST _最近访问时间(ST),_时间最新的内容修改_ CTime(平台)、ST的时间依赖性变化;最新的元数据在UNIX或Windows下的时间创作):
1 2 3 4 5 6 7 | >>> import os >>> statinfo = os.stat('somefile.txt') >>> statinfo (33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732) >>> statinfo.st_size 926L >>> |
在上面的例子,你会使用或statinfo.st _ statinfo.st影评:影评:CTime得到_ CTime和位置,分别为。
一个
在python 3.4及更高版本中,您可以使用面向对象的pathlib模块接口,该接口包括许多OS模块的包装器。下面是获取文件统计信息的示例。
1 2 3 4 5 | >>> 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) |
有关
1 2 3 4 | >>> import datetime >>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime) >>> print(mtime) datetime.datetime(2018, 10, 17, 10, 49, 0, 249980) |
如果您希望在Windows上创建时间,或者在Unix上更改最新的元数据,可以使用
1 2 3 | >>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime) >>> print(ctime) datetime.datetime(2018, 4, 11, 16, 57, 52, 151953) |
本文为Pathlib模块提供了更多有用的信息和示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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)) |
印刷品
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
1 2 3 4 5 6 | >>> import os >>> os.stat('feedparser.py').st_mtime 1136961142.0 >>> os.stat('feedparser.py').st_ctime 1222664012.233 >>> |
如果下面的符号链接是不重要的,所以你可以使用
1 2 3 4 | >>> 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 |
这包括一个
那么试试这个:
比较这与你对文件的创建日期的LS啦
他们应该是相同的。
我在创作时可以得到由POSIX系统的稳态运行的命令和解析输出。
1 | commands.getoutput('stat FILENAME').split('"')[7] |
从终端以外的Python运行统计(OS X):返回
1 | 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变化评论)。