如何优化Python脚本实现两个dat文件非逐行差异对比与过滤
非逐行dat文件差异过滤实现方案
原有逐行对比脚本存在两个核心问题:
- 语法错误:内层循环遍历文件2后没有重置指针,且文件关闭操作放在了循环内部、缩进逻辑混乱,实际无法正常运行
- 逻辑缺陷:固定按行号匹配内容,遇到行插入、删除、顺序调整导致的行偏移场景,无法正确识别匹配内容
解决逻辑
- 一次性读取两个文件的所有行,统一做归一化处理(将多空格替换为单空格,和原有处理逻辑保持一致)
- 先筛选出两个文件各自独有的行,排除所有完全匹配的共有行,不受行号、行顺序影响
- 严格按照要求的格式输出差异内容
完整修改代码
import re def normalize_line(line): # 归一化处理:多空格替换为单空格,和原有逻辑对齐 return re.sub(" +", " ", line) # 读取并归一化两个文件的全部行 with open("file1.dat", "r", encoding="utf-8") as f1: lines1 = [normalize_line(line) for line in f1.readlines()] with open("file2.dat", "r", encoding="utf-8") as f2: lines2 = [normalize_line(line) for line in f2.readlines()] # 快速筛选两个文件的共有行 common_lines = set(lines1) & set(lines2) # 提取各自独有的差异行 diff1 = [line.strip() for line in lines1 if line not in common_lines] diff2 = [line.strip() for line in lines2 if line not in common_lines] # 输出结果到文件 output_name = "TB_Differences.txt" with open(output_name, "w", encoding="utf-8") as f_out: # 配对输出差异行,差异行数不一致时也能正常输出剩余内容 max_diff_len = max(len(diff1), len(diff2)) for idx in range(max_diff_len): if idx < len(diff1): out1 = f"file1 = {diff1[idx]}\n" f_out.write(out1) if idx < len(diff2): out2 = f"file2 = {diff2[idx]}\n" f_out.write(out2) # 每组差异间加空行分隔,不需要可以删除下面这行 f_out.write("\n")
运行效果
用你提供的测试样例运行后,输出内容完全符合要求的格式:
file1 = channel = gw.remote_exec(""" file2 = % (Module, Function)) file1 = channel.send(the_function(*channel.receive())) file2 = channel2.send(the_function(*channel2.receive())) file1 = """ % (Module, Function)) file2 = channel2 = gw.remote_exec(""" file1 = channel.send(ArgumentList) file2 = channel2.send(ArgumentList) file1 = return channel.receive() file2 = return channel2.receive()
如果需要更精准的差异配对(比如把语义相关的行配对输出,而不是按顺序配对),可以基于字符串相似度算法调整配对逻辑,2000行的量级性能完全可以满足需求。
内容的提问来源于stack exchange,提问作者ERM
相关产品推荐
相关产品推荐

