如何在Python中获取文件创build和修改date/时间?
我有一个脚本,需要根据文件创build和修改date做一些东西,但必须在Linux和Windows上运行。
什么是在Python中获取文件创build和修改date/时间的最佳跨平台方式?
以一种跨平台的方式获取某种修改date非常简单 – 只需调用os.path.getmtime( path )
,就可以得到上次修改path
文件时的Unix时间戳。
另一方面,获取文件创builddate依赖于平台和平台,甚至在三大操作系统之间也不同:
- 在Windows上 ,文件的
ctime
(logging在https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx )存储其创builddate。 您可以通过os.path.getctime()
或调用os.stat()
的结果的.st_ctime
属性在Python中访问。 这在Unix上不起作用,ctime
是文件属性或内容被更改的最后一次 。 - 在Mac以及其他一些基于Unix的操作系统上,可以使用调用
os.stat()
的结果的.st_birthtime
属性。 -
在Linux上 ,目前这是不可能的,至less不用为Python编写C扩展。 尽pipe一些通常用于Linux的文件系统存储创builddate (例如,
ext4
将它们存储在st_crtime
),但是Linux内核没有提供访问它们的方法 ; 特别是从C(最新的内核版本stat()
调用返回的结构不包含任何创builddate字段 。 您还可以看到,标识符st_crtime
目前不在Python源代码中的任何位置。 至less在ext4
,数据被附加到文件系统的inode中,但是没有方便的方法来访问它。Linux
.st_mtime
好的事情是通过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
你有几个select。 首先,你可以使用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)))
你的另一个select是使用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系统上的创build时间,而是上次inode数据更改的时间。 (感谢高淳通过提供一个有趣的博客文章的链接,使这个事实更清晰的评论)
最好的函数是os.path.getmtime() 。 在内部,这只是使用os.stat(filename).st_mtime
。
date时间模块是最好的操作时间戳,所以你可以得到修改date作为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)
os.stat http://www.python.org/doc/2.5.2/lib/module-stat.html
编辑:在较新的代码中,你应该使用os.path.getmtime() (感谢Christian Oudard)
但是请注意,它返回一个浮点值time_t,分数秒(如果你的操作系统支持)
有两种获取mod时间的方法,os.path.getmtime()或os.stat(),但是ctime不是可靠的跨平台(见下文)。
os.path.getmtime()
getmtime ( path )
返回最后修改path的时间。 返回值是一个给出历元以来秒数的数字(参见时间模块)。 如果文件不存在或无法访问,则引发os.error。 1.5.2版本的新function 版本2.3中更改:如果os.stat_float_times()返回True,则结果是一个浮点数。
os.stat()
stat ( path )
在给定path上执行stat()系统调用。 返回值是属性对应于stat结构成员的对象,即:st_mode(保护位),st_ino(inode编号),st_dev(设备),st_nlink(硬链接数),st_uid(所有者的用户ID ),st_gid(所有者的组ID),st_size(文件的大小,以字节为单位),st_atime(最近访问的时间), st_mtime (最近的内容修改的时间), st_ctime (取决于平台;最近的元数据改变的时间在Unix上,或在Windows上创build的时间) :
>>> 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.stat
返回一个具有st_mtime
和st_ctime
属性的命名元组。 两个平台上的修改时间都是st_mtime
; 不幸的是,在Windows上, ctime
意味着“创build时间”,而在POSIX上意味着“更改时间”。 我不知道有什么办法在POSIX平台上获得创build时间。
>>> import os >>> os.stat('feedparser.py').st_mtime 1136961142.0 >>> os.stat('feedparser.py').st_ctime 1222664012.233 >>>
如果下面的符号链接不重要,你也可以使用os.lstat
内build。
>>> 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
os.stat
包括创build时间。 对于包含时间的os.stat()
的元素,没有st_anything的定义。
所以试试这个:
os.stat('feedparser.py')[8]
把它与你在ls -lah文件中的创builddate进行比较
他们应该是一样的。
通过运行系统的stat命令并parsing输出,我能够在posix上获得创build时间。
commands.getoutput('stat FILENAME').split('\"')[7]
从terminal(OS X)运行Python以外的python返回:
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
…第四个date时间是创build文件(而不是其他注释中提到的ctime更改时间)。