修改(替换)文件中的指定内容并保留文件修改前的时间(即修改前后文件的最后修改时间保持不变)

news2025/5/14 12:04:09

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

  • 修改(替换)文件中的指定内容并保留文件修改前的时间(即修改前后文件的最后修改时间保持不变)
    • 1. 需求场景分析
    • 2. 技术实现方案(关键步骤说明)
        • 步骤1:文件遍历与筛选
        • 步骤2:元数据备份
        • 步骤3:智能编码处理
        • 步骤4:内容替换引擎
        • 步骤5:原子写入操作
        • 步骤6:时间戳恢复
    • 3. 核心代码实现
      • 3.1 关键技术点
    • 4. 方案优化建议
      • 4.1 性能提升方向
      • 4.2 功能扩展建议
    • 5. 执行效果验证
      • 5.1 内容替换验证
      • 5.2 时间戳验证


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

修改(替换)文件中的指定内容并保留文件修改前的时间(即修改前后文件的最后修改时间保持不变)

1. 需求场景分析

在系统维护和日志处理中,常需要在不影响文件元数据的情况下修改文件内容。本方案需实现以下两个核心需求:

  1. 内容替换精准性
    将.log文件中特定日期字符串"2024/05/29"替换为"2024/04/18",需兼容不同日期格式(如YYYY-MM-DD等)

  2. 时间戳保留机制
    文件修改后需保持以下属性不变:

    • 最后访问时间(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 关键技术点

  1. 跨平台时间处理
    os.utime兼容Windows/Linux系统,时间精度达纳秒级

  2. 大文件处理优化
    采用流式读取(未展示)应对GB级日志文件

  3. 异常处理机制
    添加权限异常捕获:

    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 功能扩展建议

  1. 正则表达式支持:

    import re
    pattern = re.compile(r'\d{4}/\d{2}/\d{2}')
    new_content = pattern.sub('2024/04/18', content)
    
  2. 备份机制:

    backup_path = file_path.with_suffix('.bak')
    file_path.replace(backup_path)
    
  3. 日志记录:

    import logging
    logging.basicConfig(filename='replace.log', level=logging.INFO)
    

5. 执行效果验证

5.1 内容替换验证

日期替换对比图
图示:文件内容中的日期格式已成功替换

5.2 时间戳验证

时间戳对比图
图示:文件属性中的修改时间保持原始值


改进说明:

  1. 增加架构图提升可读性
  2. 补充类型注解和文档字符串
  3. 采用Pathlib提升路径处理安全性
  4. 增加异常处理逻辑
  5. 提出原子写入方案避免数据丢失
  6. 给出可量化的性能优化建议
  7. 添加正则表达式支持说明
  8. 优化代码结构为模块化函数

📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用探析|千眼狼PIV测量系统在职业病防治中的应用

1、职业病防治背景 随着《职业病防治法》及各省市“十四五”职业病防治规划的深入推进,工作场所粉尘危害监测与防控已成为疾控部门的核心任务。以矿山、建材、冶金、化工等行业为例,粉尘浓度、分布及传播特性的精准测量是评估职业病风险的关键。 传统的…

nvidia驱动更新-先卸载再安装-ubuntu

显卡驱动升级前,卸载旧版本,可采用两种方式。 1.命令行 (1)查找已安装的 NVIDIA 驱动和相关包:dpkg -l | grep nvidia (2)完全卸载 NVIDIA 驱动:sudo apt remove purge nvidia-*…

推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略

在 B2C 电商竞争激烈的市场环境中,精准推荐已成为提升用户体验、促进商品销售的关键。ZKmall 模板商城通过推荐算法工程化手段,深度挖掘用户数据价值,制定科学的用户分层推荐策略,实现 “千人千面” 的个性化推荐,帮助…

基于Java和PostGIS的AOI面数据球面面积计算实践

目录 前言 一、计算方法简介 二、球面面积计算 1、AOI数据转Polygon 2、Geotools面积计算 3、GeographicLib面积计算 4、PostGIS面积计算 三、结果分析 1、不同算法结果对比 2、与互联网AOI对比 3、与天地图测面对比 四、总结 前言 在现代地理信息系统(G…

Spring Boot之Web服务器的启动流程分析

如何判断创建哪种web容器:servlet?reactive? 我们在启动Spring Boot程序的时候,会使用SpringApplication.run方法来启动,在启动流程中首先要判断的就是需要启动什么类型的服务器,是servlet?或者…

【周输入】510周阅读推荐-1

本号一年了,有一定的成长,也有很多读者和点赞。自觉更新仍然远远不够,需要继续努力。 但是还是要坚持2点: 在当前这个时代,信息大爆炸,层次不齐,不追加多, 信息输入可以很多&#x…

基于动态规划的强化学习方法

目录 # 动态规划 # 基于动态规划的强化学习方法 # 求解过程: ## 策略评估 ## 策略提升 # 价值迭代算法 # 参考 # 动态规划 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。…

Uniapp Android/IOS 获取手机通讯录

介绍 最近忙着开发支付宝小程序和app,下面给大家介绍一下 app 获取通讯录的全部过程吧,也是这也是我app开发中的一项需求吧。 效果图如下 勾选配置文件 使用uniapp开发的童鞋都知道有一个配置文件 manifest.json 简单的说一下,就是安卓/ios/…

2025年RIS SCI2区,改进白鲸优化算法+复杂非线性方程组求解,深度解析+性能实测

目录 1.摘要2.白鲸优化算法BWO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 本文提出了一种改进白鲸优化算法(ABWOA)用来解决非线性方程组(SNLEs)求解问题。ABWOA引入了平衡因子和非线性自适应参数&#xff0…

Java后端开发day48--反射动态代理

(以下内容全部来自上述课程) 反射 反射允许对成员变量,成员方法和构造方法的信息进行编程访问。 就是获取里面的成员变量、构造方法和成员方法,idea中打代码跳出来的提示就是反射。 1. 获取class对象的三种方式 Class.for…

ValueError: Caught ValueError in DataLoader worker process 0.

参考链接: https://stackoverflow.com/questions/1841565/valueerror-invalid-literal-for-int-with-base-10 它提示我有个地方值错误空字符 果然因为格式处理没有传进去东西,找下原因,让它正常处理 原来是相对路径的.影响了程序运行 将v…

【数据结构】——链表OJ(下)

前面我们已经刷了几道单链表的题目,下面我们继续看几道题目。 一、相交链表 这道题题目的要求是很好理解的,就是现在我们有两个链表,然后我们就相办法进行判断,这两个链表是否是相交的,那么链表的相交其实就是有没有共…

Adobe Acrobat pro在一份PDF中插入空白页

在Adobe Acrobat pro中先打开我们的PDF文件; 用鼠标点击需要插入空白页处的上一页; 然后如下图操作: 默认会在光标处的下一页插入一张空白页,你也可以修改插入页的页码或者向前一页插入

java-----异常

对于Error:表示系统级错误或者资源耗尽的状况,像OutOfMemoryError、StackOverflowError等。这类错误是程序无法处理的,通常也不应该尝试去处理。 对于Exception:表示程序可以处理的异常。它又能细分为: 受检查异常&a…

[工具]B站缓存工具箱 (By 郭逍遥)

📌 项目简介 B站缓存工具箱是一个多功能的B站缓存工具,包含视频下载、缓存重载、文件合并及系统设置四大核心功能。基于yutto开发,采用图形化界面操作,极大简化B站资源获取与管理流程。 工具可以直接将原本缓存的视频读取&#…

自动化测试与功能测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试,它是软件测试的一个重要组成 部分,能完成许多手工测试无…

CSS经典布局之圣杯布局和双飞翼布局

目标: 中间自适应,两边定宽,并且三栏布局在一行展示。 圣杯布局 实现方法: 通过float搭建布局margin使三列布局到一行上relative相对定位调整位置; 给外部容器添加padding,通过相对定位调整左右两列的…

OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 OpenCV 的 CUDA 模块中,cv::cuda::merge 函数用于将多个单通道的 GpuMat 图像合并成一个多通道的图像。该函数是 cv::merge 的 GP…

计网实验笔记(一)CS144 Lab

Lab0 ByteStream : 实现一个在内存中的 有序可靠字节流Lab1 StreamReassembler:实现一个流重组器,一个将字节流的字串或者小段按照正确顺序来拼接回连续字节流的模块Lab2 TCPReceiver:实现入站字节流的TCP部分。Lab3 TCPSender:实…

什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP

什么是ERP? ERP翻译过来叫企业资源计划,通俗的讲,应该叫企业的全面预算控制,其通常包括三个部分:工程预算、投资预算和经营预算(即产销存预算)。之所以做预算控制,是因为企业运作的…