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

2024-11-27 10:43:00
admin
原创
11
摘要:问题描述:在 Linux 和 Windows 上获取文件创建和修改日期/时间的最佳跨平台方法是什么?解决方案 1:以跨平台的方式获取某种修改日期很容易 - 只需调用,您就会获得文件最后修改时的 Unix 时间戳。os.path.getmtime(path)`path`另一方面,获取文件创建日期很麻烦且依赖于平...

问题描述:

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


解决方案 1:

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

另一方面,获取文件创建日期很麻烦且依赖于平台,甚至三大操作系统之间也存在差异:

  • 在Windows上,文件的创建日期ctime(记录在https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx)存储其创建日期。您可以在 Python 中通过os.path.getctime().st_ctime调用结果的属性来访问它os.stat()。这在 Unix 上不起作用,因为ctime 是文件属性内容最后一次更改的时间。

  • Mac以及一些其他基于 Unix 的操作系统上,您可以使用.st_birthtime调用结果的属性os.stat()

  • 在Linux上,这目前是不可能的,至少在没有为 Python 编写 C 扩展的情况下是这样的。尽管一些常用于 Linux 的文件系统确实存储了创建日期(例如,ext4将它们存储在中st_crtime),但 Linux 内核没有提供访问它们的方法stat();特别是,从最新内核版本开始,它从 C 中的调用返回的结构不包含任何创建日期字段。您还可以看到标识符st_crtime目前在Python 源代码的任何地方都不存在。至少如果您在上使用ext4,数据附加到文件系统中的 inode 上,但没有方便的方法来访问它。

mtimeLinux 上第二好的方法是通过结果的属性os.path.getmtime()访问文件的。这将为您提供上次修改文件内容的时间,这可能适用于某些用例。.st_mtime`os.stat()`

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

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

解决方案 2:

您有几个选择。首先,您可以使用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 系统上的创建时间,而是指inode数据上次更改的时间。(感谢kojiro在评论中提供了一个有趣的博客文章链接,使*这一事实更加清晰。)

解决方案 3:

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

解决方案 4:

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

有关包含内容的更多信息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 模块的有用信息和示例。

解决方案 5:

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 上的文件 ctime 与 Windows 上的略有不同。Windows

用户将其 ctime 称为“创建时间”。Linux

用户将其 ctime 称为“更改时间”。

解决方案 6:

操作系统状态

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

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

解决方案 7:

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

os.path.getmtime()

getmtime ( path )

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

在上面的例子中,您可以分别使用 statinfo.st_mtime 或 statinfo.st_ctime 来获取 mtime 和 ctime。

解决方案 8:

os.stat`st_mtime返回具有和属性的命名元组st_ctime。修改时间st_mtime在两个平台上都是如此;不幸的是,在 Windows 上,ctime`它表示“创建时间”,而在 POSIX 上,它表示“更改时间”。我不知道在 POSIX 平台上获取创建时间的任何方法。

解决方案 9:

我是 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)来说也是可行的。

解决方案 10:

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

解决方案 11:

也许值得看一下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

解决方案 12:

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

解决方案 13:

os.stat确实包含创建时间。只是没有os.stat()包含时间的元素的 st_anything 定义。

尝试一下这个:

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

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

它们应该是一样的。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   649  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   0  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   0  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   0  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用