如何在Python中设置文件至指定日期时间?
修改文件时间(含创建时间)的Python实现
嘿,刚好碰到过类似需求,给你两种实用方案,看你场景选:
1. 最简单:调用Linux的touch命令(推荐)
你之前可能没注意到,Linux的touch本身就支持指定任意时间,用-d参数就行,甚至可以修改文件的创建时间(只要文件系统支持,比如ext4)。在Python里用subprocess直接调用就好:
修改文件的修改时间(mtime)和访问时间(atime)
import subprocess # 目标时间可以是任意touch支持的格式,比如"2023-10-01 12:00:00"、"last week"等 target_time = "2023-10-01 12:00:00" file_path = "/path/to/your/file.txt" # 执行touch命令,指定时间 subprocess.run(["touch", "-d", target_time, file_path], check=True)
修改文件的创建时间(Birth Time)
如果需要改创建时间,加上--time=birth参数就行:
subprocess.run(["touch", "--time=birth", "-d", target_time, file_path], check=True)
这个方法的好处是不用折腾Python底层,touch已经帮你处理了各种文件系统的兼容性问题。
2. 纯Python实现:用标准库或底层调用
如果不想依赖外部命令,用Python标准库可以修改访问/修改时间,修改创建时间则需要调用Linux系统调用(依赖内核版本5.8+)。
修改访问/修改时间(atime/mtime)
用os.utime直接设置时间戳:
import os from datetime import datetime # 定义目标时间 target_datetime = datetime(2023, 10, 1, 12, 0, 0) # 转成Unix时间戳(秒) timestamp = target_datetime.timestamp() # 修改文件的atime和mtime,第一个元组元素是atime,第二个是mtime os.utime(file_path, (timestamp, timestamp))
修改创建时间(Birth Time)
这个需要调用Linux的utimensat系统调用,用ctypes实现:
import os import ctypes from datetime import datetime # 定义Timespec结构体,对应Linux系统调用的时间格式 class Timespec(ctypes.Structure): _fields_ = [("tv_sec", ctypes.c_long), ("tv_nsec", ctypes.c_long)] file_path = "/path/to/your/file.txt" target_datetime = datetime(2023, 10, 1, 12, 0, 0) # 转成秒和纳秒 tv_sec = int(target_datetime.timestamp()) tv_nsec = target_datetime.microsecond * 1000 # 准备时间数组,[0]是atime,[1]是mtime,设为UTIME_OMIT保持原有值 UTIME_OMIT = ((1 << 30) - 2) times = (Timespec * 2)() times[0].tv_sec = UTIME_OMIT times[0].tv_nsec = UTIME_OMIT times[1].tv_sec = UTIME_OMIT times[1].tv_nsec = UTIME_OMIT # 调用libc的utimensat函数,UTIME_BIRTH标志表示修改birth time libc = ctypes.CDLL("libc.so.6") # AT_FDCWD表示用当前目录作为基准路径 libc.utimensat( ctypes.c_int(-100), # AT_FDCWD file_path.encode(), times, ctypes.c_int(0x40000000) # UTIME_BIRTH )
这个方法比较底层,需要确保你的Linux内核版本在5.8以上,且文件系统支持修改birth time。
内容的提问来源于stack exchange,提问作者SPRBRN
相关产品推荐
相关产品推荐

