pin_drop当前位置:知识文库 ❯ 图文
Python os.stat()获取文件信息用法详解 - 大小时间与权限
一、os.stat() 概述
os.stat() 是 Python os 模块中用于获取文件或目录详细状态信息的函数。它返回一个 os.stat_result 对象,包含文件大小、创建时间、修改时间、访问权限等丰富的元数据。
这是 Python 文件操作中最重要的函数之一,几乎所有需要获取文件属性的场景都会用到它。无论是磁盘空间分析、文件同步、日志管理,还是文件监控,都离不开 os.stat()。
二、语法与参数说明
函数语法
代码示例
os.stat(path, *, dir_fd=None, follow_symlinks=True)参数详解
三、返回值详解
返回 os.stat_result 对象,包含以下核心属性:
四、代码示例
示例1:获取文件基本信息
代码示例
import os
from datetime import datetime
# 获取文件状态信息
stat_info = os.stat('example.txt')
print(f"文件大小: {stat_info.st_size} 字节")
print(f"最后访问: {datetime.fromtimestamp(stat_info.st_atime)}")
print(f"最后修改: {datetime.fromtimestamp(stat_info.st_mtime)}")
print(f"创建时间: {datetime.fromtimestamp(stat_info.st_ctime)}")输出:
代码示例
文件大小: 1024 字节
最后访问: 2025-04-11 10:30:00
最后修改: 2025-04-10 15:20:00
创建时间: 2025-04-01 08:00:00示例2:查看所有 stat_result 属性
代码示例
import os
stat_info = os.stat('example.txt')
print("stat_result 属性:")
for attr in dir(stat_info):
if attr.startswith('st_'):
print(f" {attr}: {getattr(stat_info, attr)}")输出:
代码示例
stat_result 属性:
st_atime: 1712825400.0
st_ctime: 1711948800.0
st_dev: 1234567
st_gid: 0
st_ino: 987654
st_mode: 33206
st_mtime: 1712754000.0
st_nlink: 1
st_size: 1024
st_uid: 0示例3:判断文件类型和权限
代码示例
import os
import stat
stat_info = os.stat('example.txt')
# 判断文件类型
is_file = stat.S_ISREG(stat_info.st_mode)
is_dir = stat.S_ISDIR(stat_info.st_mode)
# 判断权限
is_readable = bool(stat_info.st_mode & stat.S_IRUSR)
print(f"是普通文件: {is_file}")
print(f"是目录: {is_dir}")
print(f"所有者可读: {is_readable}")
print(f"权限八进制: {oct(stat.S_IMODE(stat_info.st_mode))}")输出:
代码示例
是普通文件: True
是目录: False
所有者可读: True
权限八进制: 0o666五、实际应用场景
-
文件监控:通过比较 st_mtime 检测文件是否被修改,实现自动触发任务(如热重载、文件同步)
-
磁盘清理:通过 st_size 和 st_atime 找出大文件和长期未访问的文件,释放磁盘空间
-
文件同步:通过比较 st_mtime 判断源文件和目标文件哪个更新,决定是否需要复制更新
六、注意事项
注意:
st_ctime在 Windows 上是创建时间,在 Unix/Linux 上是元数据最后修改时间(如权限变更)。不要跨平台依赖 st_ctime 作为创建时间。
注意:时间戳为浮点数(Unix 时间戳,秒为单位,含小数部分)。需要使用
datetime.fromtimestamp()转换为可读格式。
注意:符号链接默认会被跟随(
follow_symlinks=True),即获取的是链接目标的信息。设置follow_symlinks=False可获取链接文件本身的信息。
小贴士
将字节大小转换为可读格式:可以使用辅助函数 format_size(bytes),依次除以 1024 转换为 KB、MB、GB 等单位。判断文件类型时,推荐使用 stat.S_ISREG()、stat.S_ISDIR() 等函数,而不是直接比较 st_mode 数值。
七、常见问题 FAQ
st_mtime 和 st_ctime 有什么区别?
st_mtime 是文件内容最后修改的时间。st_ctime 在 Windows 上是文件创建时间,在 Unix/Linux 上是元数据(权限、所有者等)最后修改的时间。如果需要跟踪文件内容变化,应使用 st_mtime。
如何将 st_size(字节)转换为人类可读的格式?
可以编写辅助函数:依次将字节数除以 1024,选择适当的单位(B、KB、MB、GB、TB)。例如:def format_size(size): for unit in ['B','KB','MB','GB','TB']: if size < 1024: return f"{size:.1f}{unit}"; size /= 1024
os.stat() 和 pathlib.Path.stat() 有什么区别?
两者底层实现相同,返回的对象类型也一致。os.stat() 使用字符串路径,pathlib.Path.stat() 使用面向对象的方式。推荐使用 pathlib(Python 3.4+)处理路径操作,代码更优雅。
如何获取符号链接本身的信息而不是目标的信息?
设置 follow_symlinks=False 参数:os.stat('symlink_path', follow_symlinks=False)。这样获取的是链接文件本身的元信息,而不是链接目标的信息。也可以使用 os.lstat(),它等价于 os.stat(path, follow_symlinks=False)。
如何判断文件是否被修改过?
记录文件的 st_mtime 值,下次获取同样的值进行比较。如果 st_mtime 发生变化,说明文件内容已被修改。这是文件监控和增量备份的核心原理。
练习题
练习1
编写程序,获取指定文件的大小和修改时间,并将大小转换为 KB/MB/GB 格式,修改时间转换为 YYYY-MM-DD HH:MM:SS 格式输出。
练习2
编写函数 find_largest_files(directory, n=5),找出指定目录中最大的 5 个文件,按大小降序排列输出。提示:结合 os.listdir() 和 os.stat() 使用。
本文涉及AI创作
内容由AI创作,请仔细甄别