python标准库无法直接修改文件创建时间(ctime),仅能通过os.utime()设置访问时间(atime)和修改时间(mtime),且需文件存在、有写权限;windows上改ctime须调用api(如pywin32),linux/macos中ctime不可设。

Python 标准库无法直接修改文件的创建时间(ctime)——在 Windows 上 ctime 是“创建时间”,但在 macOS/Linux 上它实际是“元数据最后变更时间”,且不可设;你只能改最后修改时间(mtime)和最后访问时间(atime),而且必须用 os.utime(),不能靠简单赋值或第三方库“绕过”系统限制。
用 os.utime() 同时设置 atime 和 mtime
os.utime() 是唯一跨平台、无需额外依赖的可靠方式。它不接受“创建时间”参数,传入的元组或 times 参数只影响 atime 和 mtime:
- 传
(atime, mtime)元组:两个时间都按秒级时间戳(float)给 - 传
ns=(atime_ns, mtime_ns):纳秒级精度(Python 3.3+,更精确) - 若只设一个时间,另一个用
None表示“保持原值”
示例:
import os import time <p>path = "example.txt"</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6591" title="Li Python Sec Check"><img src="https://img.php.cn/upload/skill/000/000/081/179102166033725.jpg" alt="Li Python Sec Check" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6591" title="Li Python Sec Check" class="overflowclass">Li Python Sec Check</a> <p class="overflowclass">Python 安全规范检查工具:基于 CloudBase 规范、腾讯安全指南,LLM 智能分析(默认禁用,优先本地执行)</p> </div> <a rel="nofollow" href="/xiazai/skill6591" title="Li Python Sec Check" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>设为当前时间(atime 和 mtime 都更新)</h1><p>os.utime(path, times=(time.time(), time.time()))</p><h1>只更新 mtime,atime 不变</h1><p>os.utime(path, times=(None, time.time())) </p>
Windows 上能否设“创建时间”?
可以,但必须调用 Windows API(SetFileTime),Python 标准库不提供接口,需用 pywin32 或 ctypes。注意:ctime 在 Windows 上才是真正的创建时间,但修改它需要管理员权限(尤其对系统目录或受保护文件),且很多杀毒软件会拦截。
- 用
pywin32更稳妥:win32file.SetFileTime(handle, ctime, atime, mtime),其中ctime是pywintypes.Time类型 - 用
ctypes调用kernel32.dll更底层,但容易因结构体对齐或时区出错 - 即使成功,某些文件系统(如 ReFS)或 OneDrive/WSL 挂载路径可能忽略该设置
常见错误和兼容性坑
这些操作看似简单,但实际踩坑率很高:
-
OSError: [Errno 1] Operation not permitted:Linux/macOS 下普通用户无权修改其他用户的文件时间;macOS 对 SIP 保护目录(如/System)完全禁止 - 传入
int时间戳导致纳秒丢失:Python 3.3+ 的os.utime(..., ns=...)要求元组元素是int(纳秒),不是float;误用会报TypeError - 时区混淆:所有时间戳必须是 UTC 或本地时间?答案是——全看系统。Python 不做转换,
os.utime()直接交给内核,所以建议统一用time.time()(返回本地时区对应的浮点秒数)或time.time_ns() - 文件被占用时失败:Windows 下如果文件正被记事本、IDE 或病毒扫描器打开,
SetFileTime会返回ERROR_ACCESS_DENIED
真正难的不是写几行代码,而是判断“这个时间值到底有没有被系统采纳”——最好用 os.stat() 读回来比对,且要在同一文件系统、同一权限上下文中验证,否则你以为改成功了,其实只是调用没报错而已。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










