0

0

Python文件时间戳获取:os.stat的权威指南

心靈之曲

心靈之曲

发布时间:2025-08-15 22:24:01

|

826人浏览过

|

来源于php中文网

原创

Python文件时间戳获取:os.stat的权威指南

本教程详细介绍了在Python中获取文件创建、修改和访问时间戳的正确方法。我们将深入探讨os.stat()函数及其返回的stat_result对象,特别是st_ctime、st_mtime和st_atime属性。文章提供了清晰的代码示例,并强调了将原始时间戳转换为易读的datetime对象的重要性,帮助开发者高效、准确地管理文件元数据。

python编程中,获取文件的创建、修改或访问时间戳是常见的需求,这对于文件管理、数据同步或审计等任务至关重要。然而,许多初学者可能会遇到诸如attributeerror: module 'ntpath' has no attribute 'gettime'之类的错误,这通常是由于使用了不正确的api,例如尝试调用os.path.gettime()。本文将详细阐述如何利用python内置的os模块,特别是os.stat()函数,来准确有效地获取这些文件时间戳。

理解文件时间戳与os.stat()

Python的os模块提供了与操作系统交互的功能,其中os.stat()函数是获取文件或目录元数据的主要接口。它接受一个文件路径作为参数,并返回一个stat_result对象。这个stat_result对象包含了文件的多种信息,如大小、权限、inode号等,以及我们关心的三种主要时间戳信息:

  • st_ctime: 文件元数据最后一次改变的时间。在Unix/Linux系统上,这通常是inode(索引节点)的修改时间,即文件权限、所有者、链接数等元数据发生变化时更新。在Windows系统上,st_ctime通常代表文件的创建时间。
  • st_mtime: 文件内容最后一次修改的时间。这是最常用的时间戳之一,表示文件数据何时被写入或修改。
  • st_atime: 文件最后一次访问的时间。当文件被读取(打开、执行)时,这个时间戳可能会更新。

这些属性返回的时间戳是浮点数,表示自Unix纪元(1970年1月1日00:00:00 UTC)以来的秒数。为了便于人类阅读和进行日期时间计算,通常需要将这些原始时间戳转换为datetime对象。

实践:获取文件时间戳

以下是一个完整的Python代码示例,演示了如何使用os.stat()获取文件的创建、修改和访问时间,并将其转换为可读的datetime对象。

企奶奶
企奶奶

一款专注于企业信息查询的智能大模型,企奶奶查企业,像聊天一样简单。

下载
import os
import datetime
import time

def get_file_timestamps(file_path):
    """
    获取指定文件的创建时间、修改时间和访问时间。

    Args:
        file_path (str): 文件的完整路径。

    Returns:
        dict: 包含 'creation_time', 'modification_time', 'access_time' 的字典,
              值为 datetime 对象。如果文件不存在或发生其他错误,则返回 None。
    """
    try:
        # 获取文件状态信息
        file_stat = os.stat(file_path)

        # 提取原始时间戳(Unix Epoch秒数)
        # st_ctime: 元数据修改时间 (Unix/Linux) 或创建时间 (Windows)
        # st_mtime: 文件内容修改时间
        # st_atime: 文件最后访问时间
        creation_timestamp = file_stat.st_ctime
        modification_timestamp = file_stat.st_mtime
        access_timestamp = file_stat.st_atime

        # 将时间戳转换为datetime对象,方便阅读和操作
        creation_datetime = datetime.datetime.fromtimestamp(creation_timestamp)
        modification_datetime = datetime.datetime.fromtimestamp(modification_timestamp)
        access_datetime = datetime.datetime.fromtimestamp(access_timestamp)

        return {
            "creation_time": creation_datetime,
            "modification_time": modification_datetime,
            "access_time": access_datetime
        }
    except FileNotFoundError:
        print(f"错误:文件 '{file_path}' 不存在。")
        return None
    except Exception as e:
        print(f"获取文件时间戳时发生未知错误:{e}")
        return None

# 示例用法
if __name__ == "__main__":
    # 定义一个测试文件路径
    test_file_name = "sample_document.txt"

    # 1. 创建一个测试文件(如果不存在)
    if not os.path.exists(test_file_name):
        with open(test_file_name, "w") as f:
            f.write("这是一个用于测试文件时间戳的示例文档。\n")
            f.write("初始内容。\n")
        print(f"已创建测试文件: {test_file_name}")
    else:
        print(f"测试文件已存在: {test_file_name}")

    # 2. 获取并打印初始文件时间戳
    print("\n--- 初始文件时间戳 ---")
    initial_timestamps = get_file_timestamps(test_file_name)
    if initial_timestamps:
        print(f"文件路径: {test_file_name}")
        print(f"创建时间 (st_ctime): {initial_timestamps['creation_time']}")
        print(f"修改时间 (st_mtime): {initial_timestamps['modification_time']}")
        print(f"访问时间 (st_atime): {initial_timestamps['access_time']}")

    # 3. 模拟文件内容修改,观察 st_mtime 变化
    print("\n--- 修改文件内容后 ---")
    time.sleep(1) # 暂停1秒,确保时间戳有明显变化
    with open(test_file_name, "a") as f:
        f.write("追加了新的内容。\n")
    modified_timestamps = get_file_timestamps(test_file_name)
    if modified_timestamps:
        print(f"文件路径: {test_file_name}")
        print(f"创建时间 (st_ctime): {modified_timestamps['creation_time']}")
        print(f"修改时间 (st_mtime): {modified_timestamps['modification_time']}")
        print(f"访问时间 (st_atime): {modified_timestamps['access_time']}")

    # 4. 模拟文件访问,观察 st_atime 变化(可能不明显,取决于系统配置)
    print("\n--- 访问文件内容后 ---")
    time.sleep(1) # 暂停1秒
    with open(test_file_name, "r") as f:
        _ = f.read() # 读取文件内容
    accessed_timestamps = get_file_timestamps(test_file_name)
    if accessed_timestamps:
        print(f"文件路径: {test_file_name}")
        print(f"创建时间 (st_ctime): {accessed_timestamps['creation_time']}")
        print(f"修改时间 (st_mtime): {accessed_timestamps['modification_time']}")
        print(f"访问时间 (st_atime): {accessed_timestamps['access_time']}")

    # 5. 尝试获取不存在的文件时间戳
    print("\n--- 尝试获取不存在的文件时间戳 ---")
    get_file_timestamps("non_existent_file.txt")

    # 可选:清理测试文件
    # try:
    #     os.remove(test_file_name)
    #     print(f"\n已删除测试文件: {test_file_name}")
    # except OSError as e:
    #     print(f"删除文件时发生错误: {e}")

注意事项与重要考量

  1. st_ctime的平台差异性: 务必注意st_ctime在不同操作系统上的含义可能不同。在Windows系统上,它通常表示文件的创建时间。但在Unix/Linux系统上,它表示文件inode(即文件元数据,如权限、所有者、链接数)的最后修改时间,而非文件本身的创建时间。如果需要严格意义上的创建时间,可能需要依赖特定操作系统的API或文件系统特性。
  2. 时间戳与datetime对象: os.stat()返回的时间戳是浮点数,表示自Unix纪元(1970年1月1日00:00:00 UTC)以来的秒数。为了便于人类阅读和进行日期时间计算,强烈建议使用datetime.datetime.fromtimestamp()将其转换为datetime对象。
  3. 错误处理: 在实际应用中,文件路径可能不存在。建议使用try-except FileNotFoundError块来优雅地处理这种情况,避免程序崩溃。示例代码中已包含此处理。
  4. st_atime的更新: st_atime(访问时间)在某些文件系统配置下可能不会频繁更新,或者可以通过挂载选项禁用更新以提高性能(例如在Linux中使用noatime挂载选项)。因此,不应完全依赖st_atime来判断文件的访问情况。
  5. 循环处理: 如果需要在循环中获取多个文件的时间戳,上述方法同样适用。只需确保file_path变量在每次迭代中都指向正确的文件即可。

总结

通过本文,我们学习了在Python中获取文件创建、修改和访问时间戳的正确且跨平台兼容的方法,即使用os.stat()函数。掌握st_ctime、st_mtime和st_atime这些关键属性,并结合datetime模块进行时间戳转换,能够帮助开发者准确地管理文件元数据。在实际应用中,务必注意st_ctime的平台差异性,并加入适当的错误处理机制,以确保程序的健壮性。这种方法是Python处理文件时间戳的标准和推荐方式。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1079

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

169

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1407

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

17

2026.01.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

740

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1128

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

799

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.08.02

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号