os.utime可修改文件atime和mtime,需文件存在且有写权限;传路径不传时间则设为当前时间;纳秒精度需用ns参数;ls -l默认显示mtime,查atime需stat或os.stat。

os.utime 修改文件时间戳的基本用法
直接调用 os.utime 就能改访问时间(atime)和修改时间(mtime),不需要额外模块或 root 权限,但目标文件必须存在且有写权限。
最简形式是传入文件路径和一个二元组:(atime, mtime),两个值都得是 Unix 时间戳(秒级浮点数):
import os
os.utime("example.txt", (1717027200.0, 1717027200.0)) # 2024-05-30 00:00:00
注意:如果只传路径不传时间元组,os.utime 会把 atime 和 mtime 都设为当前时间 —— 这不是“不改”,而是默认行为。
如何设置精确到纳秒的时间戳(Python 3.3+)
系统底层支持纳秒级时间戳,但 os.utime 默认只接受秒级。要启用纳秒精度,必须显式传入 ns 参数(元组内为整数纳秒):
-
os.utime(path, ns=(atime_ns, mtime_ns))—— 此时忽略普通浮点参数,只认纳秒整数 - 常见错误:混用
times和ns,会报TypeError: utime() takes no keyword arguments(取决于 Python 版本) - 获取当前纳秒时间可用
time.time_ns(),比time.time() * 1e9更可靠
示例:
import os, time
now_ns = time.time_ns()
os.utime("log.txt", ns=(now_ns, now_ns))
为什么修改后用 ls -l 看不到变化?
根本原因:Linux 默认挂载选项是 relatime 或 noatime,导致 atime 不再随读取自动更新,但 os.utime 写入的 atime 仍会被保存 —— 只是 ls -l 显示的是 mtime。
验证真实时间戳要用:
-
stat example.txt(终端命令,显示 atime/mtime/ctime 全部) - Python 中用
os.stat(path).st_atime、os.stat(path).st_mtime
另外:某些文件系统(如 exFAT、FAT32)只保留 2 秒或 10 毫秒精度,设了纳秒也没用;ext4/XFS 通常支持纳秒,但实际存储粒度可能仍是纳秒或微秒。
跨平台兼容性与权限陷阱
Windows 下 os.utime 能设 atime/mtime,但 ctime(创建时间)不可修改;Linux/macOS 下 ctime 完全由内核控制,任何方式都无法手动设置。
容易踩的坑:
- 路径不存在 → 报
OSError: [Errno 2] No such file or directory,需先确保文件存在 - 在只读文件系统(如挂载为
ro)上调用 →PermissionError: [Errno 1] Operation not permitted - 普通用户尝试修改其他用户文件的时间戳(非所有者且无 CAP_FOWNER)→ 失败,除非是 root 或文件属主
- 使用
follow_symlinks=False时,若路径是软链接,操作的是链接本身而非目标文件(此时 atime/mtime 指链接元数据)
真正难处理的是 NFS 或容器挂载卷:部分服务端会忽略客户端传入的时间戳,或者强制同步为服务器本地时间 —— 这类场景建议加一层 os.stat 回读校验。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











