如何按列比对两个文件的数据并输出不匹配结果?
文件内容比对解决方案
需求说明
- 比对
input.txt与output.txt的行数据,按以下规则生成结果文件:- 若
input.txt某行的**第一列(地址)**未在output.txt中出现,将该行写入unmatch.txt; - 若地址匹配但**第二列(数据)**不匹配,将两行对应数据(input行和output行)写入
un_data.txt。
- 若
现有文件内容
input.txt
000000008b8c5200 bcbiubcbueqihd167 0000000056fb2620 akbhjgbfre34168gf 0000000045ab4630 jbshjdb7usvyysdu8 00000000672fa001 jhwdggdiuqwhuhius
output.txt
00000000af16380f avhdhjwqdjdkjdnxk 0000000056fb2620 akbhjgbfre34168gf 0000000045ab4630 jbshjdb7usvyysdu8 000000008b8c5200 bdqjhwdjhfjjehfiu
现有代码问题
原代码直接整行比对,无法区分「地址匹配但数据不匹配」的场景,也未按需求生成指定的输出文件。
解决方案代码
# 读取output.txt,构建地址到整行内容的映射字典 output_addr_map = {} with open("output.txt", "r") as f_output: for line in f_output: cleaned_line = line.strip() if not cleaned_line: continue addr, data = cleaned_line.split(maxsplit=1) output_addr_map[addr] = cleaned_line # 初始化结果列表 unmatch_content = [] un_data_content = [] # 遍历input.txt处理每一行 with open("input.txt", "r") as f_input: for line in f_input: cleaned_line = line.strip() if not cleaned_line: continue input_addr, input_data = cleaned_line.split(maxsplit=1) # 情况1:地址未在output中出现 if input_addr not in output_addr_map: unmatch_content.append(cleaned_line) else: # 情况2:地址匹配但数据不匹配 output_line = output_addr_map[input_addr] _, output_data = output_line.split(maxsplit=1) if input_data != output_data: un_data_content.append(f"input: {cleaned_line}") un_data_content.append(f"output: {output_line}\n") # 写入unmatch.txt with open("unmatch.txt", "w") as f_unmatch: f_unmatch.write("\n".join(unmatch_content)) # 写入un_data.txt with open("un_data.txt", "w") as f_un_data: f_un_data.write("\n".join(un_data_content))
代码逻辑说明
- 构建映射字典:先将
output.txt的内容按「地址-整行」的关系存入字典,实现地址的快速查找; - 逐行处理input:拆分每行的地址和数据,分别判断属于哪种情况,将对应内容存入结果列表;
- 生成结果文件:将两个结果列表的内容分别写入需求指定的文件。
内容的提问来源于stack exchange,提问作者V_S
相关产品推荐
相关产品推荐

