Python3实现两文件seqNum匹配行搜索输出的问题排查
问题排查与解决方案
原有代码的问题
- 语法错误:判断条件里写了大写的
Y,实际变量名是小写的y,直接运行会抛出NameError - 逻辑错误:使用
zip()同时遍历两个文件,只会按行号一一对应比对,且迭代次数和行数更少的文件一致。如果两个文件中相同seqNum的行不在同一行号,根本匹配不到结果 - 匹配逻辑不严谨:直接用
seqNu in x判断,会出现模糊匹配问题,比如查询seqNum为416时会误匹配到seqNum为41648的行
正确实现思路
先遍历其中一个文件,提取所有seqNum和对应行的映射关系存入字典,再遍历第二个文件匹配相同seqNum的条目,避免逐行对应的限制,同时精确提取seqNum值做比对。
修复后代码
场景1:查询两个文件中所有seqNum匹配的条目
import re def get_all_matched_seq(file1, file2): # 正则匹配精确提取seqNum值 seq_pattern = re.compile(r'seqNum="(\d+)"') # 先处理file1,构建seqNum到行内容的映射 seq_map = {} with open(file1, 'r', encoding='utf-8') as f1: for line in f1: seq_match = seq_pattern.search(line) if not seq_match: continue seq_num = seq_match.group(1) # 可根据需求保留整行或者仅保留时间 content = line.split("updateMsg")[0].strip() seq_map[seq_num] = content # 遍历file2匹配相同seqNum with open(file2, 'r', encoding='utf-8') as f2: for line in f2: seq_match = seq_pattern.search(line) if not seq_match: continue seq_num = seq_match.group(1) if seq_num in seq_map: f2_content = line.split("updateMsg")[0].strip() print(f"seqNum={seq_num} | file1时间:{seq_map[seq_num]} | file2时间:{f2_content}")
场景2:查询指定seqNum在两个文件中的对应条目
import re def get_specify_seq(target_seq, file1, file2): target_seq = str(target_seq) seq_pattern = re.compile(r'seqNum="(\d+)"') # 查file1的对应内容 f1_res = None with open(file1, 'r', encoding='utf-8') as f1: for line in f1: match = seq_pattern.search(line) if match and match.group(1) == target_seq: f1_res = line.split("updateMsg")[0].strip() break # 查file2的对应内容 f2_res = None with open(file2, 'r', encoding='utf-8') as f2: for line in f2: match = seq_pattern.search(line) if match and match.group(1) == target_seq: f2_res = line.split("updateMsg")[0].strip() break if f1_res and f2_res: print(f"seqNum={target_seq} | file1时间:{f1_res} | file2时间:{f2_res}") else: print(f"seqNum={target_seq} 未在两个文件中同时找到")
内容的提问来源于stack exchange,提问作者TinyT
相关产品推荐
相关产品推荐

