如何在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.getmtimeos.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()

getmtimepath
返回最后修改path的时间。 返回值是一个给出历元以来秒数的数字(参见时间模块)。 如果文件不存在或无法访问,则引发os.error。 1.5.2版本的新function 版本2.3中更改:如果os.stat_float_times()返回True,则结果是一个浮点数。

os.stat()

statpath
在给定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_mtimest_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更改时间)。