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

Mar*_*iek 860 python file

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

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

Bry*_*ley 659

你有几个选择.首先,您可以使用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)))
Run Code Online (Sandbox Code Playgroud)

您的另一个选择是使用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))
Run Code Online (Sandbox Code Playgroud)

:ctime()指创建时间在*nix系统,而是最后一次inode的数据变化.(感谢kojiro通过提供一个有趣的博客文章的链接在评论中更清楚地说明这一事实)

  • 万一有人错过@ Glyph对该问题的评论,[ctime并不意味着在POSIX系统上创建时间](http://userprimary.net/posts/2007/11/18/ctime-in-unix-means-last-改变时间而不是创建时间/).我想知道有多少人在过去三年中浏览了这篇文章并继续编写有缺陷的代码. (162认同)
  • 请记住,第一个示例为您提供了一个字符串,而不是日期时间或数字. (16认同)

Mar*_*ery 530

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

另一方面,获取文件创建日期是繁琐且依赖于平台的,甚至在三个大型操作系统之间也是如此:

总而言之,跨平台代码看起来应该是这样的......

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
Run Code Online (Sandbox Code Playgroud)

  • 坦率地说,文件创建时间通常是相当无用的.当您使用模式"w"打开现有文件进行写入时,它不会替换它,它只是打开现有文件并截断​​它.即使文件内容与创建时的内容完全无关,您仍然会被告知文件在当前版本之前已"创建".相反,即使您刚删除了一个字符,在保存时使用原子替换的编辑器(原始文件被新的正在进行的临时文件替换)也会显示更新的创建日期.使用修改时间,不要创建时间. (21认同)
  • 我已经尽力把它放在一起(并花了几个小时研究过程),我确信它至少比以前的答案更正确*但是这真的很难*主题,我很感激人们可以提供的任何更正,澄清或其他输入.特别是,我想构建一种在Linux下的"ext4"驱动器上访问这些数据的方法,我想了解当Linux读取Windows编写的文件时会发生什么,或者反之亦然,因为他们使用`st_ctime `不同. (7认同)
  • @olibre*"至少ctime比真正的创作时间更接近mtime"* - 不是不是; 这是我见过的几次,但这完全是假的.除非你手动混乱与您的inode中的价值观,`ctime`应始终等于或*后*比`mtime`,因为`mtime`改变**的原因了`ctime`变化(因为`mtime`本身被认为是"元数据").请参阅/sf/answers/2766504261/,其中我提供了一些示例代码来说明这一点. (4认同)
  • 请注意,自 Linux 4.11 起,“虽然 Linux 常用的某些文件系统确实存储创建日期 [...],但 Linux 内核无法提供访问它们的方式”这一说法不再成立: `statx` 系统调用 *确实* 允许查询`btime` 如果可用于给定文件。(然而,即使在 Python 3.8 中也没有使用/公开。) (4认同)
  • 多年以后,我终于找到了创建文件的时间!我正在编写代码来检查某些目录中的文件命名约定,所以首先我要考虑在约定之后首先命名的文件.更换整个内容(mtime)是无关紧要的:如果它已经存在,那么它就已经过了. (3认同)
  • 嗨马克。我建议简化。在 Linux 上,返回 [`stat.st_ctime`](https://docs.python.org/3/library/os.html?highlight=st_ctime#os.stat_result.st_ctime) 更为相关,因为在许多情况下, *最后一次元数据更改*的时间可以是创建时间(至少`ctime`比`mtime`更接近真实的*创建时间*)。因此,您可以简单地将您的代码段替换为 `stat = os.stat(path_to_file); 尝试:返回stat.st_birthtime;除了 AttributeError: 返回 stat.st_ctime`。你怎么认为?干杯 (2认同)

Chr*_*ard 368

用于此的最佳函数是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)
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

  • 我强烈建议在这里使用“datetime.datetime.fromtimestamp(t, tz=datetime.timezone.utc)”,因为否则返回的天真“datetime”对象倾向于被解释为本地时区,而 Unix 时间戳是始终相对于 01.01.1970 00:00 UTC。 (3认同)
  • 这个答案也有点错误。`getmtime` 是 Unix 上最接近的函数(不可能获取创建日期),但绝对不是在 Windows 上使用的最佳函数,其中 `ctime` 是创建时间。 (2认同)
  • @MarkAmery - 这个答案明确标注为修改时间. (2认同)

Mar*_*ett 47

os.stat https://docs.python.org/2/library/stat.html#module-stat

编辑:在较新的代码中你应该使用os.path.getmtime()(感谢Christian Oudard)
但请注意它返回一个浮点值time_t,其中包含分数秒(如果你的操作系统支持它)

  • os.path.getmtime()是为此而制作的,并且更简单. (44认同)
  • 这里的"新代码"条款有点误导.`os.path.getmtime()`自Python 1.5.2以来就已存在(参见[旧文档](https://docs.python.org/release/1.5.2/lib/module-os.path.html )),在我丢失大部分宝宝牙齿之前发布,差不多十年才写下这个答案的原始版本. (5认同)

Jay*_*Jay 38

有两种方法可以获得mod时间,os.path.getmtime()或os.stat(),但ctime不是可靠的跨平台(见下文).

os.path.getmtime()

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

os.stat()

stat(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上创建的时间):

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您将使用statinfo.st_mtime或statinfo.st_ctime分别获取mtime和ctime.


mit*_*ndi 11

os.stat返回一个名为元组st_mtimest_ctime属性.修改时间st_mtime在两个平台上; 不幸的是,在Windows上,ctime意味着"创建时间",而在POSIX上则意味着"改变时间".我不知道如何在POSIX平台上获得创建时间.


Ste*_*ell 9

在Python 3.4及更高版本中,您可以使用面向对象的pathlib模块接口,该接口包括许多os模块的包装器。这是获取文件统计信息的示例。

>>> 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)
Run Code Online (Sandbox Code Playgroud)

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

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)
Run Code Online (Sandbox Code Playgroud)

如果要在Windows上创建时间,或者在Unix上需要最新的元数据更改,则可以使用fname.stat().st_ctime

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
Run Code Online (Sandbox Code Playgroud)

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


Pud*_*dle 8

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))
Run Code Online (Sandbox Code Playgroud)

版画

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
Run Code Online (Sandbox Code Playgroud)