如何用Python从文件A提取Query值并在大文件B中查重?
解决方案:精准匹配两个文件中的Query字段并输出结果
你的原代码直接判断整个File A内容是否在File B中,无法实现精准匹配单个条目的Query字段,也没法关联对应的ID。以下是可行的实现方案:
核心思路
- 先处理大文件File B,提取所有
Query字段的值存入集合(集合查找效率为O(1),适合大文件场景) - 处理File A,逐个提取每个条目的
ID和Query值,检查该Query是否存在于File B的集合中,存在则输出指定提示
代码实现
针对两个文件中无逗号分隔的连续JSON对象格式,我们用正则匹配拆分每个独立JSON对象,再解析处理:
import re import json # 第一步:提取File B中所有Query值,存入集合 file_b_queries = set() with open('FileB', 'r') as f2: content = f2.read() # 跳过开头的文件头,提取后续JSON内容 json_part = content.split(']')[1] if '[' in content else content # 匹配每个独立的JSON对象 json_objects = re.findall(r'\{.*?\}', json_part, re.DOTALL) for obj_str in json_objects: try: obj = json.loads(obj_str) if 'Query' in obj: file_b_queries.add(obj['Query']) except json.JSONDecodeError: # 跳过解析失败的不规范JSON continue # 第二步:处理File A,检查每个条目 with open('FileA', 'r') as f1: content = f1.read() json_objects = re.findall(r'\{.*?\}', content, re.DOTALL) for obj_str in json_objects: try: obj = json.loads(obj_str) entry_id = obj.get('ID', 'Unknown') query_val = obj.get('Query') if query_val and query_val in file_b_queries: print(f"Entry ID {entry_id} already exist in File B!") else: print(f"Importing entry {entry_id}....") except json.JSONDecodeError: continue
关键细节说明
- 正则匹配JSON对象:
re.findall(r'\{.*?\}', content, re.DOTALL)用于匹配所有{}包裹的JSON片段,re.DOTALL确保匹配包含换行的JSON对象 - File B头部处理:通过
split(']')[1]跳过开头的[_some fileheader info],如果文件头格式不同,可调整此逻辑 - 集合存储优化:用集合存储Query值,既避免重复数据,又大幅提升大文件的查找效率
- 错误容错:加入
try-except捕获JSON解析错误,避免因文件中存在不规范JSON导致程序崩溃
测试结果
用你提供的示例文件运行代码,会输出:
Entry ID 01 already exist in File B! Importing entry 02....
内容的提问来源于stack exchange,提问作者XynoYoo__
相关产品推荐
相关产品推荐

