os.stat 返回的 stat_result 对象包含 st_atime(最后访问时间)、st_mtime(最后修改时间)、st_ctime(windows 为创建时间,linux/macos 为元数据变更时间,非创建时间)三个时间字段。

os.stat 返回的 stat_result 对象里有哪些时间字段
调用 os.stat(path) 会返回一个 stat_result 对象,它包含多个时间戳属性,但命名容易混淆:st_atime 是最后访问时间,st_mtime 是最后修改时间,st_ctime 在 Windows 上是创建时间,在 Linux/macOS 上是元数据变更时间(比如权限改了、硬链接数变了),**不是创建时间**。
所以如果你真要“文件创建时间”,得先确认操作系统:
- Windows:用
st_ctime是安全的 - Linux/macOS:无法通过
os.stat可靠获取创建时间,st_ctime只能当作“状态变更时间”参考
获取文件大小最直接的方式就是 st_size
os.stat(path).st_size 返回字节数,这是最轻量、最可靠的方法——不读文件内容,只查 inode 元数据,毫秒级完成。
注意几个常见误操作:
- 别用
len(open(path).read()):大文件会爆内存,且读取编码可能出错 - 别用
pathlib.Path(path).read_bytes():同样加载全文,毫无必要 - 如果路径是符号链接,默认返回链接目标的大小;加
follow_symlinks=False才查链接本身(Python 3.8+ 支持)
把时间戳转成可读日期要注意时区
st_atime、st_mtime、st_ctime 都是浮点数(秒级时间戳,含微秒),直接 print 看不到人类友好的格式。常用转换方式:
-
time.ctime(stat.st_mtime):本地时区,简单但不够灵活 -
datetime.fromtimestamp(stat.st_mtime):返回带本地时区的datetime对象 -
datetime.utcfromtimestamp(stat.st_mtime):UTC 时间,适合日志对齐
特别注意:Windows 的 st_ctime 精度是 100ns,但 Python 的 fromtimestamp 只接受秒/微秒,会自动截断,实际损失精度;如需高精度,得用 datetime.fromtimestamp(stat.st_ctime, tz=timezone.utc) 并手动处理纳秒部分(极少见需求)。
os.stat 在路径不存在或权限不足时会抛异常
这不是“返回 None”,而是直接报错:FileNotFoundError 或 PermissionError。生产代码里必须处理:
- 用
os.path.exists(path)预检只是多一次系统调用,不如直接 try/except - 捕获
OSError(它是FileNotFoundError和PermissionError的父类)更简洁 - 避免在循环里反复调用
os.stat查同一文件——结果可以缓存,尤其在遍历目录时
文件系统元数据看似简单,但跨平台行为、异常路径、精度陷阱都藏在细节里;多数时候你真正需要的只是 st_size 和 st_mtime,其它字段别默认当成“标准语义”去用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











