Windows 上 st_ctime 是创建时间,Linux/macOS 上是元数据变更时间;st_mtime 在所有平台均表示内容最后修改时间,可靠;跨平台无通用创建时间方案。

Windows 上能拿到真实创建时间,Linux/macOS 上 os.stat().st_ctime 实际是“元数据变更时间”,不是文件创建时间。
用 os.stat() 读取基础时间戳
Python 的 os.stat() 是最直接的方式,但要注意不同系统语义差异:
-
st_ctime:Windows 是创建时间;Linux/macOS 是 inode 最后修改时间(比如权限改了、重命名了都会变) -
st_mtime:所有平台都表示内容最后修改时间,可靠 -
st_atime:访问时间,但 Linux 默认挂载时带noatime,可能不更新
示例:
import os
stat = os.stat('example.txt')
print('创建/状态变更时间:', stat.st_ctime) # 注意含义因系统而异
print('修改时间:', stat.st_mtime)
print('访问时间:', stat.st_atime)跨平台获取“真正创建时间”的现实方案
没有通用、可靠的跨平台创建时间。如果你必须尝试,可以分情况处理:
立即学习“Python免费学习笔记(深入)”;
- Windows:直接用
os.stat().st_ctime,基本准确 - macOS:可用
subprocess调mdls -name kMDItemFSCreationDate(依赖 Spotlight,不一定启用) - Linux:没有标准创建时间字段,
stat -c '%W' file返回 0,ext4/xfs 等也不暴露 birth time 给用户态
所以多数工具(包括 pathlib.Path.stat())都只能返回 st_ctime 并注明“平台相关”。
用 stat.filemode() 解析访问权限
os.stat().st_mode 是一个整数,需要用 stat.filemode() 转成人类可读的字符串:
import os, stat
mode = os.stat('example.txt').st_mode
print(stat.filemode(mode)) # 输出类似 '-rw-r--r--'注意:
- 它只反映当前权限位,不体现 ACL、SELinux 上下文等扩展控制
- 如果文件是符号链接,默认
os.stat()跟随链接;要查链接本身权限,用os.lstat() - 权限判断逻辑(如
os.access(path, os.R_OK))比解析st_mode更推荐用于运行时检查
别忽略 pathlib 的简洁写法
pathlib 提供更现代的接口,但底层仍是 os.stat():
from pathlib import Path
p = Path('example.txt')
print('修改时间:', p.stat().st_mtime)
print('权限:', oct(p.stat().st_mode)[-3:]) # 八进制后三位,如 '644'
print('可读?', p.is_file() and os.access(p, os.R_OK))它的优势是链式调用和路径操作统一,但时间语义、权限细节和 os.stat() 完全一致 —— 别因为它看着“新”就误以为解决了创建时间问题。
真正麻烦的从来不是怎么写代码,而是搞清 st_ctime 在你部署的每台机器上到底代表什么。


















