You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:50:17