Python 3中避免覆盖打印结果文件并自动生成新文件diff的方法
实现Python脚本生成不重复输出文件并自动对比差异
核心需求拆解
- 脚本运行时自动生成不重复的输出文件,避免覆盖原有记录
- 生成新文件后,自动与之前的文件执行diff对比,输出差异内容
解决方案代码示例
1. 导入依赖模块
import os import difflib
2. 生成唯一文件名函数
这个函数会自动检测目标目录下的文件,若存在同名文件则添加数字后缀(如switch_log.txt → switch_log_1.txt),确保文件名唯一:
def get_unique_filename(base_dir, base_name): name, ext = os.path.splitext(base_name) counter = 1 new_filename = base_name while os.path.exists(os.path.join(base_dir, new_filename)): new_filename = f"{name}_{counter}{ext}" counter += 1 return os.path.join(base_dir, new_filename)
3. 获取最新历史文件(自动对比基准)
如果需要自动选取同目录下最新的历史文件作为diff基准,可以用这个函数:
def get_latest_file(dir_path, prefix): # 筛选同前缀的文件 file_prefix = prefix.split('.')[0] files = [f for f in os.listdir(dir_path) if f.startswith(file_prefix)] if not files: return None # 按文件修改时间倒序排序,取最新的文件 files.sort(key=lambda x: os.path.getmtime(os.path.join(dir_path, x)), reverse=True) return os.path.join(dir_path, files[0])
4. 主逻辑流程
替换其中的交换机命令执行代码为你实际的业务逻辑即可:
# 配置输出目录和基础文件名 output_dir = "./switch_outputs" base_filename = "switch_log.txt" # 确保输出目录存在,不存在则自动创建 os.makedirs(output_dir, exist_ok=True) # 获取最新的历史文件(作为diff的基准) old_log_file = get_latest_file(output_dir, base_filename) # 生成新的唯一输出文件名 new_log_file = get_unique_filename(output_dir, base_filename) # ---------- 这里替换为你的交换机命令执行与写入逻辑 ---------- # 示例:模拟写入交换机输出内容 with open(new_log_file, 'w', encoding='utf-8') as f: # 实际场景中替换为:执行交换机命令→捕获输出→写入文件 f.write("交换机命令执行结果:\n") f.write("show version\n") f.write("Cisco IOS XE Software, Version 17.03.04\n") # --------------------------------------------------------- # 执行diff对比(如果存在历史文件) if old_log_file: print(f"正在对比文件:\n旧文件:{old_log_file}\n新文件:{new_log_file}\n") # 读取两个文件的内容 with open(old_log_file, 'r', encoding='utf-8') as f_old, open(new_log_file, 'r', encoding='utf-8') as f_new: old_content = f_old.readlines() new_content = f_new.readlines() # 生成统一格式的diff差异 diff_result = difflib.unified_diff( old_content, new_content, fromfile=old_log_file, tofile=new_log_file, lineterm='' ) # 打印差异到控制台 print("=== 差异内容 ===") for line in diff_result: print(line) # 可选:将差异写入单独的文件保存 diff_save_path = get_unique_filename(output_dir, "diff_result.txt") with open(diff_save_path, 'w', encoding='utf-8') as f_diff: # 重新生成diff结果(因为迭代器只能遍历一次) diff_result = difflib.unified_diff(old_content, new_content, fromfile=old_log_file, tofile=new_log_file, lineterm='') f_diff.writelines(diff_result) print(f"\n差异已保存到:{diff_save_path}") else: print(f"未找到历史文件,已生成新的输出文件:{new_log_file}")
关键说明
- 文件名唯一性:通过计数器后缀确保不会覆盖任何已有文件,适用于多次运行脚本的场景
- diff对比:使用Python内置的
difflib模块,无需依赖外部diff工具,跨平台兼容 - 编码处理:统一使用
utf-8编码读写文件,避免特殊字符或中文乱码 - 目录兼容:自动创建输出目录,无需提前手动创建
内容的提问来源于stack exchange,提问作者Juhi
相关产品推荐
相关产品推荐

