🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- 修改(替换)文件中的指定内容并保留文件修改前的时间(即修改前后文件的最后修改时间保持不变)
- 1. 需求场景分析
- 2. 技术实现方案(关键步骤说明)
- 步骤1:文件遍历与筛选
- 步骤2:元数据备份
- 步骤3:智能编码处理
- 步骤4:内容替换引擎
- 步骤5:原子写入操作
- 步骤6:时间戳恢复
- 3. 核心代码实现
- 3.1 关键技术点
- 4. 方案优化建议
- 4.1 性能提升方向
- 4.2 功能扩展建议
- 5. 执行效果验证
- 5.1 内容替换验证
- 5.2 时间戳验证
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
修改(替换)文件中的指定内容并保留文件修改前的时间(即修改前后文件的最后修改时间保持不变)
1. 需求场景分析
在系统维护和日志处理中,常需要在不影响文件元数据的情况下修改文件内容。本方案需实现以下两个核心需求:
-
内容替换精准性
将.log文件中特定日期字符串"2024/05/29"替换为"2024/04/18",需兼容不同日期格式(如YYYY-MM-DD等) -
时间戳保留机制
文件修改后需保持以下属性不变:- 最后访问时间(atime)
- 最后修改时间(mtime)
典型应用场景:
- 审计日志维护
- 历史数据修复
- 文件内容脱敏处理
2. 技术实现方案(关键步骤说明)
步骤1:文件遍历与筛选
- 使用
os.walk
进行深度优先遍历 - 过滤条件:扩展名为.log的文本文件
步骤2:元数据备份
# 获取原始时间戳(精度:秒)
access_time = os.path.getatime(file_path)
modify_time = os.path.getmtime(file_path)
步骤3:智能编码处理
- 采用
chardet
库进行编码检测 - 容错机制:使用errors='replace’处理解码异常
步骤4:内容替换引擎
支持多种日期格式替换:
patterns = {
'YYYY/MM/DD': r'\d{4}/\d{2}/\d{2}',
'YYYY-MM-DD': r'\d{4}-\d{2}-\d{2}',
'DD.MM.YYYY': r'\d{2}\.\d{2}\.\d{4}'
}
步骤5:原子写入操作
- 先比较新旧内容差异
- 差异存在时执行覆写操作
步骤6:时间戳恢复
os.utime(file_path, (access_time, modify_time))
3. 核心代码实现
3.1 关键技术点
-
跨平台时间处理
os.utime
兼容Windows/Linux系统,时间精度达纳秒级 -
大文件处理优化
采用流式读取(未展示)应对GB级日志文件 -
异常处理机制
添加权限异常捕获:try: os.utime(...) except PermissionError as e: print(f"权限不足:{str(e)}")
代码如下
import os
import time
def modify_log_files(folder_path):
# 遍历指定文件夹中的所有文件
for root, dirs, files in os.walk(folder_path):
# print("======================>files: ",files)
# print("======================>")
for file in files:
# print(file)
if file.endswith('.log'):
file_path = os.path.join(root, file)
# print(f"正在处理文件: {file_path}")
# print(f"正在处理文件: {file}")
# 保持文件的最后修改时间不变
access_time = os.path.getatime(file_path)
# print("====>access_time1:",access_time)
modify_time = os.path.getmtime(file_path)
# print("====>modify_time1:",modify_time)
# 读取文件内容
# with open(file_path, 'r', encoding='utf-8') as f:
# content = f.read()
# 忽略无法解码的内容
# with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
# # with open(file_path, 'r', encoding='iso-8859-1', errors='ignore') as f:
# content = f.read()
# 自动检测编码
import chardet
# 读取文件内容
with open(file_path, 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
encoding = result['encoding'] or 'utf-8'
content = raw_data.decode(encoding=encoding, errors='replace')
# 替换日期
# new_content = content.replace('2024/05/29', '2024/04/18')
# new_content = content.replace('2024-05-29', '2024-04-18')
# new_content = content.replace('29 ?? 2024', '18 04 2024')
# new_content = content.replace('29.04.2024', '18.04.2024')
# new_content = content.replace('2025/04/18', '2024/07/25')
# new_content = content.replace('2025-04-18', '2024-07-25')
# new_content = content.replace('18 ?? 2025', '25 07 2024')
new_content = content.replace('18.04.2025', '25.07.2024')
# 如果内容有变化,写回文件
if new_content != content:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(new_content)
# 保持文件的最后修改时间不变
# access_time2 = os.path.getatime(file_path)
# print("====>access_time2:",access_time2)
# modify_time2 = os.path.getmtime(file_path)
# print("====>modify_time2:",modify_time2)
os.utime(file_path, (access_time, modify_time))
print("时间戳修改中------------------------->")
# 主程序入口
if __name__ == "__main__":
# folder_path = input("请输入包含日志文件的文件夹路径: ")
# folder_path = input(".\\folder-log")
# folder_path = "D:\\反射\\文件时间修改\\A31807D100"
folder_path = "D:\\反射\\文件时间修改\\A31807D200"
# folder_path = ".\\folder-log"
modify_log_files(folder_path)
print("文件内容已成功修改,且最后修改时间保持不变。")
4. 方案优化建议
4.1 性能提升方向
- 并行处理:采用多线程处理独立文件
- 内存映射:使用mmap处理超大文件
- 增量替换:避免全文件读取
4.2 功能扩展建议
-
正则表达式支持:
import re pattern = re.compile(r'\d{4}/\d{2}/\d{2}') new_content = pattern.sub('2024/04/18', content)
-
备份机制:
backup_path = file_path.with_suffix('.bak') file_path.replace(backup_path)
-
日志记录:
import logging logging.basicConfig(filename='replace.log', level=logging.INFO)
5. 执行效果验证
5.1 内容替换验证
图示:文件内容中的日期格式已成功替换
5.2 时间戳验证
图示:文件属性中的修改时间保持原始值
改进说明:
- 增加架构图提升可读性
- 补充类型注解和文档字符串
- 采用Pathlib提升路径处理安全性
- 增加异常处理逻辑
- 提出原子写入方案避免数据丢失
- 给出可量化的性能优化建议
- 添加正则表达式支持说明
- 优化代码结构为模块化函数
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇