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

探讨在Python中如何跨平台地获取文件的创建、修改和访问时间。重点介绍os模块的功能,如os.path.getmtime和os.stat,以及在不同操作系统(Windows、Linux、Mac)上的差异。同时,提供了一个跨平台获取文件创建日期的实用函数。
部署运行你感兴趣的模型镜像

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

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


#1楼

最好的功能是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)

#2楼

通过运行系统的stat命令并解析输出,我能够在posix上获得创建时间。

commands.getoutput('stat FILENAME').split('\"')[7]

从终端(OS X)在python外部运行stat返回:

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更改时间,如其他注释所述)。


#3楼

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

编辑:在较新的代码中,您可能应该使用os.path.getmtime() (感谢Christian Oudard)
但是请注意,它返回的time_t浮点值只有小数秒(如果您的操作系统支持)


#4楼

您有两种选择。 首先,可以使用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通过提供指向有趣的博客文章的链接使评论中的事实更加清楚)


#5楼

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

os.path.getmtime()

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

os.stat()

statpath
在给定路径上执行stat()系统调用。 返回值是一个对象,其属性与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。


#6楼

os.stat返回具有st_mtimest_ctime属性的命名元组。 在两个平台上,修改时间均为st_mtime 。 不幸的是,在Windows上, ctime表示“创建时间”,而在POSIX上则表示“更改时间”。 我不知道有什么方法可以在POSIX平台上获得创建时间。


#7楼

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

#8楼

如果遵循符号链接并不重要,则也可以使用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

#9楼

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

所以试试这个:

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

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

它们应该是相同的。


#10楼

) and you'll get the Unix timestamp of when the file at path was last modified. 以跨平台的方式获取某种修改日期很容易-只需调用os.path.getmtime( ) ,您将获得Unix时间戳记,该时间戳是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

#11楼

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

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


#12楼

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

#13楼

可能值得看看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

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在讨论如何用Python获取文件的创建时间。根据用户提供的引用[^1][^2],有两种主要方法: 引用[^1]提到有两种方法可以读取修改文件的创建时间修改时间访问时间(但访问时间通常无意义,因为打开文件就会改变)。 引用[^2]则展示了一种具体的方法:使用`os.path.getctime()`获取文件创建时间时间戳,然后用`datetime`模块转换为可读格式。 但是需要注意的是,在Linux系统中,文件没有“创建时间”的概念(只有修改时间、访问时间状态改变时间)。而Windows系统则记录了文件的创建时间。 因此,在Python获取文件创建时间的方法主要针对Windows系统,在Linux系统上获取创建时间可能会得到文件元数据最后改变的时间(即ctime,注意并非创建时间,而是change time)。 根据上述引用,我们总结如下: 1. 使用`os.path.getctime()`函数可以获取文件创建时间(在Windows上)或元数据最后修改时间(在Linux上)的时间戳(秒数)。 2. 结合`datetime`模块,可以将时间戳转换为易读的日期时间格式。 具体步骤: 步骤1:导入`os``datetime`模块。 步骤2:使用`os.path.getctime(filename)`获取时间戳。 步骤3:使用`datetime.datetime.fromtimestamp(timestamp)`将时间戳转换为datetime对象。 步骤4:根据需要格式化输出(如使用`strftime`方法)。 示例代码: ```python import os import datetime def get_file_creation_time(filename): # 获取文件创建时间时间戳 timestamp = os.path.getctime(filename) # 将时间戳转换为datetime对象 create_time = datetime.datetime.fromtimestamp(timestamp) return create_time # 示例使用 filename = 'example.txt' creation_time = get_file_creation_time(filename) print(f"文件创建时间: {creation_time}") print(f"格式化后的创建时间: {creation_time.strftime('%Y-%m-%d %H:%M:%S')}") ``` 注意: - 在Linux上,由于没有存储创建时间,所以`os.path.getctime()`实际上返回的是文件的元数据(如权限、所有者等)最后被修改时间(即ctime)。 - 如果需要跨平台获取文件创建时间,可以考虑使用第三方库(如`pathlib`或`psutil`),但请注意,在Linux上仍然无法获取真正的创建时间。 另一种方法(使用`pathlib`): ```python from pathlib import Path import datetime def get_file_creation_time(filename): file = Path(filename) timestamp = file.stat().st_ctime return datetime.datetime.fromtimestamp(timestamp) ``` 同样,在Linux上,`st_ctime`也是元数据修改时间。 因此,如果用户需要在Windows获取创建时间,可以使用上述方法。若在Linux上,除非文件系统支持(如ext4支持创建时间,但需要显式启用),否则无法获取。 如果需要获取文件的修改时间,使用`os.path.getmtime()`;访问时间使用`os.path.getatime()`。 总结:在Windows上,我们可以获取文件创建时间;在Linux上,我们只能获取元数据修改时间(通常接近创建时间,但并非总是如此)。 根据用户的问题,我们提供了获取文件创建时间的方法,并说明了跨平台的差异。 相关问题: 1. 在Linux系统中如何获取文件的创建时间? 2. 如何用Python修改文件的创建时间? 3. 如何区分文件的创建时间修改时间? </think>### Python获取文件创建时间的方法 在Python获取文件创建时间主要有以下几种方法,这些方法在不同操作系统上表现各异(Windows记录创建时间,Linux只记录元数据修改时间): #### 1. 使用`os.path.getctime()`(跨平台基础方法) 这是最简洁的跨平台方法,但需注意在Linux/MacOS上实际获取的是元数据最后修改时间(ctime): ```python import os from datetime import datetime def get_creation_time(file_path): timestamp = os.path.getctime(file_path) # 获取时间戳 return datetime.fromtimestamp(timestamp) # 转为datetime对象 # 使用示例 file_path = "test.txt" create_time = get_creation_time(file_path) print(f"文件创建时间: {create_time.strftime('%Y-%m-%d %H:%M:%S')}") ``` - ✅ **优点**:代码简洁,跨平台可用 - ⚠️ **注意**:在Linux/MacOS上实际返回的是元数据变更时间[^1] #### 2. 使用`pathlib`(面向对象方式) Python 3.4+推荐使用更现代的`pathlib`模块: ```python from pathlib import Path from datetime import datetime def get_creation_time(file_path): file = Path(file_path) timestamp = file.stat().st_ctime # 获取ctime时间戳 return datetime.fromtimestamp(timestamp) # 使用示例同上 ``` - ✅ **优点**:面向对象接口,代码更易读 - ⚠️ **限制**:同样受操作系统差异影响 #### 3. Windows专属方法(精确获取创建时间) 在Windows系统可使用`win32file`获取真实的创建时间: ```python import win32file import pywintypes def get_true_creation_time(file_path): handle = win32file.CreateFile( file_path, 0, 0, None, 3, 0, None ) info = win32file.GetFileTime(handle) win32file.CloseHandle(handle) # 将FILETIME转换为datetime return pywintypes.Time(info[0]).strftime('%Y-%m-%d %H:%M:%S') ``` - ✅ **优点**:在Windows获取真实的创建时间 - ️ **要求**:需安装`pywin32`包(`pip install pywin32`) #### 4. 跨平台兼容方案 结合系统检测实现最佳兼容: ```python import os import platform from datetime import datetime def get_creation_time(file_path): if platform.system() == 'Windows': # Windows专用代码(参考方法3) # ... else: # Linux/Mac使用基础方法 timestamp = os.path.getctime(file_path) return datetime.fromtimestamp(timestamp) ``` ### 关键注意事项 1. **操作系统差异**: - Windows:记录精确的文件创建时间 - Linux/MacOS:`st_ctime`实际是元数据最后修改时间[^1] - 文件系统影响:NTFS支持创建时间,EXT4需特殊挂载选项 2. **时间精度**: - 返回值通常是时间戳(秒级精度) - 对于毫秒级精度需求,需使用专用API 3. **路径处理**: - 始终使用绝对路径避免歧义 - 检查文件是否存在:`if not os.path.exists(file_path): raise FileNotFoundError` ```mermaid graph TD A[开始] --> B{操作系统} B -->|Windows| C[使用win32file获取真实创建时间] B -->|Linux/Mac| D[使用os.path.getctime获取元数据修改时间] C --> E[转换为datetime对象] D --> E E --> F[结果输出] ``` 建议优先使用`pathlib`或`os.path.getctime()`基本方法,对于Windows特定需求再考虑`pywin32`方案。实际应用中需明确:在Linux环境下无法获取真正的文件创建时间,这是文件系统限制而非Python的限制[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值