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


当前回答

>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

其他回答

以跨平台的方式获取某种修改日期很容易——只需调用os.path.getmtime(path),就会得到文件在path上最后一次修改的Unix时间戳。

另一方面,获取文件创建日期非常繁琐,而且依赖于平台,甚至在三大操作系统之间也有所不同:

On Windows, a file's ctime (documented at https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx) stores its creation date. You can access this in Python through os.path.getctime() or the .st_ctime attribute of the result of a call to os.stat(). This won't work on Unix, where the ctime is the last time that the file's attributes or content were changed. On Mac, as well as some other Unix-based OSes, you can use the .st_birthtime attribute of the result of a call to os.stat(). On Linux, this is currently impossible, at least without writing a C extension for Python. Although some file systems commonly used with Linux do store creation dates (for example, ext4 stores them in st_crtime) , the Linux kernel offers no way of accessing them; in particular, the structs it returns from stat() calls in C, as of the latest kernel version, don't contain any creation date fields. You can also see that the identifier st_crtime doesn't currently feature anywhere in the Python source. At least if you're on ext4, the data is attached to the inodes in the file system, but there's no convenient way of accessing it. The next-best thing on Linux is to access the file's mtime, through either os.path.getmtime() or the .st_mtime attribute of an os.stat() result. This will give you the last time the file's content was modified, which may be adequate for some use cases.

把这些放在一起,跨平台代码应该是这样的……

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

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

操作系统。Stat包含了创建时间。os.stat()中包含时间的元素没有st_anything的定义。

所以试试这个:

os.stat('feedparser.py')[8]

将其与ls -lah文件上的创建日期进行比较

它们应该是一样的。

os.stat

在更新的代码中,您可能应该使用os.path.getmtime()(谢谢,Christian Oudard)。

但是请注意,它返回一个带分数秒的浮点值time_t(如果您的操作系统支持它)。

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