如何获取文件创建和修改日期/时间



获取文件创建和修改日期/时间的最佳跨平台方法是什么,适用于Linux和Windows?

以跨平台的方式获取某种修改日期很容易 - 只需调用os.path.getmtime(path),您将获得上次修改文件path的Unix时间戳。

另一方面,获取文件创建日期是繁琐且依赖于平台的,即使在三个大型操作系统之间也有所不同:

  • Windows 上,文件的ctime(记录在 https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx)存储其创建日期。您可以在 Python 中通过调用 os.stat() 的结果的 os.path.getctime().st_ctime 属性来访问它。这 Unix 上不起作用,其中ctime是最后一次更改文件的属性内容的时间。
  • Mac 以及其他一些基于 Unix 的操作系统上,您可以使用调用 os.stat() 的结果的 .st_birthtime 属性。
  • Linux上,这目前是不可能的,至少没有为Python编写C扩展。虽然一些常用的文件系统确实存储了创建日期(例如,ext4将它们存储在st_crtime中),但Linux内核不提供访问它们的方法;特别是,它从 C 中的stat()调用返回的结构(从最新的内核版本开始)不包含任何创建日期字段。您还可以看到标识符st_crtime当前在 Python 源代码中的任何位置都没有。至少如果你在ext4,数据附加到文件系统中的索引节点,但没有方便的访问方式。

    Linux上的下一个最好的办法是访问文件的mtime,通过os.path.getmtime()os.stat()结果的.st_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

你有几个选择。首先,您可以使用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)))

您的另一个选择是使用 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 系统上的创建时间,而是索引节点数据上次更改的时间。(感谢小次郎通过提供指向有趣博客文章的链接,在评论中更清楚地表明了这一事实。

用于此目的的最佳函数是 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)

在 Python 3.4 及更高版本中,您可以使用面向对象的 pathlib 模块接口,其中包含大部分操作系统模块的包装器。 下面是获取文件统计信息的示例。

>>> 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, tz=datetime.timezone.utc)
>>> 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, tz=datetime.timezone.utc)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

本文提供了有关 pathlib 模块的更多有用信息和示例。

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

注意:Linux 上的文件时间与 Windows.
上的文件时间略有不同。Windows用户将他们的时间称为"创建时间".
Linux用户将他们的时间称为"更改时间"。

os.stat

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

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

有两种方法可以获取 mod time,os.path.getmtime() 或 os.stat(),但 ctime 在跨平台时并不可靠(见下文)。

os.path.getmtime()

getmtimepath
返回上次修改路径的时间。返回值是一个数字,给出自纪元以来的秒数(请参阅时间模块)。如果文件引发 os.error不存在或无法访问。版本 1.5.2 中的新功能。在 2.3 版更改: 如果os.stat_float_times() 返回 True,结果是一个浮点数。

os.stat()

statpath
在给定路径上执行 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。

os.stat返回一个具有st_mtimest_ctime属性的命名元组。两个平台上的修改时间都st_mtime;不幸的是,在Windows上,ctime的意思是"创建时间",而在POSIX上,它的意思是"改变时间"。我不知道有什么方法可以在POSIX平台上获得创建时间。

可能值得看看实现跨平台访问文件创建时间的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

我是pathlib的粉丝。

from pathlib import Path
target = Path('out/soong/build.ninja')
mtime = target.stat().st_mtime
atime = target.stat().st_atime
ctime = target.stat().st_ctime

我相信这对于Windows Subsystem for Linux(WSL)也是可行的。

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

如果以下符号链接不重要,您也可以使用内置的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

os.stat确实包括创建时间。 对于包含时间的os.stat()元素,没有st_anything的定义。

所以试试这个:

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

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

它们应该是相同的。

相关内容

  • 没有找到相关文章

最新更新