昨天帮公司同事解决了个小问题——他要批量修改一批文件的最后修改时间,查了半天资料,代码要么报错要么没效果,折腾了快半天。我拿过来看了下,其实就几行代码的事儿,10分钟就搞定了。
其实设置文件最后修改时间是Python文件操作里超实用的技巧,不管是做测试模拟文件时间、整理本地文件,还是处理工作中的批量文件,都能用到。今天就把我整理的方法和踩过的坑分享给大家,新手也能一看就会。
刚开始学Python做文件操作时,我踩过的坑能列一串。相信很多新手都有这感受:明明照着教程写的代码,就是跑不通,要么参数不对,要么时间格式错,越改越懵。其实核心就两个点:时间要转成时间戳、路径要写对,把这俩搞定,问题就解决了80%。
Python设置文件最后修改时间,核心就两种方法:基础的os模块(兼容性强,所有Python版本都能用)、简洁的pathlib模块(Python3.4+适用,写起来更顺手),我都拆解得明明白白。
方法1:os模块(基础款,稳不出错)
核心函数是os.utime(),它能同时设置文件的“访问时间”和“修改时间”,搭配time模块处理时间格式就行。
核心步骤:
- 确定文件路径(绝对路径/相对路径都可以,推荐绝对路径,避免路径错误);
- 把想要设置的时间转换成“时间戳”(Python只认这个格式,直接传日期会报错);
- 调用
os.utime(),传入路径和(访问时间戳,修改时间戳)。
示例代码(直接复制能用):
import os
import time
# 1. 要修改的文件路径(替换成你的文件路径)
file_path = "test.txt"
# 场景1:改成当前时间(最简单)
current_timestamp = time.time() # 获取当前时间戳
os.utime(file_path, (current_timestamp, current_timestamp)) # 第一个是访问时间,第二个是修改时间
print(f"已将{file_path}的最后修改时间设为当前时间")
# 场景2:改成指定时间(比如2026-01-01 12:00:00)
# 先把指定时间转成时间元组,再转成时间戳
target_time = time.strptime("2026-01-01 12:00:00", "%Y-%m-%d %H:%M:%S")
target_timestamp = time.mktime(target_time)
os.utime(file_path, (target_timestamp, target_timestamp))
print(f"已将{file_path}的最后修改时间设为2026-01-01 12:00:00")
方法2:pathlib模块(简洁款,写起来更舒服)
Python3.4之后出的pathlib,用“面向对象”的方式处理路径,不用记一堆路径拼接的函数,搭配datetime模块更顺手。
核心步骤:
- 把指定时间转成datetime对象,再转成时间戳;
- 调用
touch()方法(文件不存在会自动创建,存在就更新时间)。
示例代码(直接复制能用):
from pathlib import Path
from datetime import datetime
import time
import os
# 1. 指定文件路径
file_path = Path("test.txt")
# 场景1:改成当前时间
file_path.touch() # 直接更新为当前时间,超简单
print(f"已将{file_path}的最后修改时间设为当前时间")
# 场景2:改成指定时间(2024-01-01 12:00:00)
target_datetime = datetime(2026, 1, 1, 12, 0, 0) # 年、月、日、时、分、秒
target_timestamp = time.mktime(target_datetime.timetuple())
# 设置修改时间
os.utime(file_path, (target_timestamp, target_timestamp)) # pathlib最终还是调用os.utime,更易读
print(f"已将{file_path}的最后修改时间设为2026-01-01 12:00:00")
光看基础示例不够,分享两个我日常用得最多的案例,新手直接复制改路径就能用。
案例1:批量修改文件夹下所有类型文件的修改时间
比如把“docs”文件夹里所有文件的修改时间,都改成2026-01-01 12:00:00:
import os
import time
from pathlib import Path
# 目标文件夹路径(替换成你的路径)
folder_path = "docs"
# 目标时间(转成时间戳)
target_time = time.strptime("2026-01-01 12:00:00", "%Y-%m-%d %H:%M:%S")
target_timestamp = time.mktime(target_time)
for file in Path(folder_path).glob("*"): # 用"*"匹配当前文件夹所有内容
if file.is_file(): # 只处理文件,跳过文件夹
os.utime(file, (target_timestamp, target_timestamp))
print(f"已修改:{file}")
print("批量修改完成!")
案例2:修改文件夹 + 所有子文件夹下的所有文件(递归)
如果你的文件夹里还有子文件夹,想把所有层级的文件都改了,就用 **/*(注意加 recursive=True):
import os
import time
from pathlib import Path
folder_path = "docs"
target_time = time.strptime("2026-01-01 12:00:00", "%Y-%m-%d %H:%M:%S")
target_timestamp = time.mktime(target_time)
for file in Path(folder_path).glob("**/*", recursive=True):
if file.is_file():
os.utime(file, (target_timestamp, target_timestamp))
print(f"已修改:{file}")
print("递归批量修改完成!")
设置文件最后修改时间的核心是os.utime()函数,关键要把时间转成时间戳(直接传日期字符串会报错); 新手优先用os模块(兼容性强),Python3.4+可以用pathlib模块(代码更易读);批量修改文件时,一定要加is_file()判断,避免误改文件夹。
其实这些个技巧不难,核心就是把“时间格式”和“文件路径”这两个坑避开,剩下的就是套模板。新手多练两次,下次遇到改文件时间的需求,10分钟就能搞定~