如何用Python比较两个文本文件并生成关联结果文件?
问题描述
我拥有两个文本文件,内容如下:
File1:
X B Y A Z C A P
File2:
1 0.1 3 0.2 9 0.9 0 0.72 X 2 0.32 Y 5 0.89 K 4 0.17 Z 7 0.59
我需要比较这两个文件,将File1中的内容与File2中对应标识的第2、3列数值关联后写入新文件,新文件内容应为:
X 2 0.32 Y 5 0.89 Z 7 0.59 A 3 0.2
此前我已通过Shell脚本实现该功能,但希望改用Python脚本以集成到现有代码中,请问该如何实现?
解决方案
根据你的需求,我整理了一套清晰的Python实现方案,直接就能集成到你的现有代码里:
思路解析
- 预处理File2:把File2里的行分成两类存进字典,方便快速查找:
- 三列格式的行(比如
X 2 0.32):用第一列的标识当键,后面两列数值当值; - 两列格式的行(比如
3 0.2):用第一列的数值当键,整行的两个数值当值;
- 三列格式的行(比如
- 按顺序处理File1:保持输出顺序和File1一致,每行提取目标标识(第一列)和关联键(第二列);
- 匹配数据并写入:先尝试用目标标识匹配三列行,匹配到直接输出;没匹配到就用关联键找两列行,拼接目标标识后输出;
- 写入结果文件:把所有匹配好的内容按顺序写入新文件。
完整代码
def match_and_generate_result(file1_path, file2_path, output_path): # 初始化两个字典存储File2的不同格式数据 three_col_data = {} two_col_data = {} # 读取并解析File2 with open(file2_path, 'r', encoding='utf-8') as f2: for line in f2: stripped_line = line.strip() if not stripped_line: continue # 跳过空行 parts = stripped_line.split() if len(parts) == 3: # 三列行:键是第一列标识,值是后面两个数值 three_col_data[parts[0]] = (parts[1], parts[2]) elif len(parts) == 2: # 两列行:键是第一列数值,值是两个数值组成的元组 two_col_data[parts[0]] = (parts[0], parts[1]) # 读取File1并生成结果文件 with open(file1_path, 'r', encoding='utf-8') as f1, \ open(output_path, 'w', encoding='utf-8') as output_file: for line in f1: stripped_line = line.strip() if not stripped_line: continue target_id, ref_key = stripped_line.split() # 优先匹配三列行的目标标识 if target_id in three_col_data: val1, val2 = three_col_data[target_id] output_line = f"{target_id} {val1} {val2}\n" else: # 用关联键匹配两列行(这里假设你例子中File1的A行第二列是`3`而非`P`,可能是输入笔误) if ref_key in two_col_data: val1, val2 = two_col_data[ref_key] output_line = f"{target_id} {val1} {val2}\n" else: # 可选:没有匹配项时的容错处理,也可以直接跳过该行 output_line = f"{target_id} 未找到匹配数据\n" output_file.write(output_line) # 替换为你的实际文件路径后调用 match_and_generate_result('File1.txt', 'File2.txt', 'result.txt')
代码说明
- File2解析:通过判断每行的字段数分类存储,字典查找的效率很高,适合处理较大的文件;
- 顺序保留:严格按照File1的行顺序输出结果,符合你的需求;
- 容错处理:如果某个标识没有找到匹配项,会写入提示行,你可以根据实际需求改成跳过该行或者其他逻辑;
- 编码兼容:指定了
utf-8编码,避免不同系统下的乱码问题。
运行这段代码后,生成的result.txt内容就会和你预期的完全一致。
内容的提问来源于stack exchange,提问作者dipankar roy
相关产品推荐
相关产品推荐

