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

How to get file creation & modification date/times in Python?

我有一个脚本需要根据文件创建和修改日期做一些事情,但必须在Linux和Windows上运行。

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


你有几的选择。一,你可以使用os.path.getmtimeos.path.getctime函数:

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)))

您的其他选择是使用os.stat

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))

注:ctime()不问题,创作时在*nix系统,但不是最后的时间节点的数据被更改。(小次郎的事实更清楚,使通过提供一个链接的评论有趣的博客帖子)


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

另一方面,获取文件创建日期非常复杂,而且依赖于平台,这三大操作系统之间甚至存在差异:

  • 在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(使用)。在内部,这os.stat(filename).st_mtime即时使用。

这是最好的manipulating datetime模块时间戳,这样你可以得到的修改对象的日期作为一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和位置,分别为。


一个os.stat归来st_mtimest_ctime元组和属性命名。在修改的时间是在这两个平台st_mtime;不幸的是,在Windows中,ctime均值"创作时间",而"变化的时均值在POSIX信息"。我不知道任何一个POSIX平台上得到的创作时间。


在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)

有关os.stat_result包含的内容的更多信息,请参阅文档。对于您要修改的时间,fname.stat().st_mtime

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上更改最新的元数据,可以使用fname.stat().st_ctime

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
>>>

如果下面的符号链接是不重要的,所以你可以使用os.lstatbuiltin。

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


这包括一个os.stat创作时间。它只是没有定义任何的圣约_ os.stat(),包含元素的时间。

那么试试这个:

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

比较这与你对文件的创建日期的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变化评论)。