Python如何对比两份文档匹配ID并打印文档B中对应的完整行
报错原因
你写的第二种方案触发错误有两个核心原因:
- 变量名覆盖:你一开始把API返回的目标ID列表存在
data变量,后续读文件时又执行data = f.readlines(),直接把原来的ID列表覆盖成了文件行列表 - 判断逻辑写反:
line.__contains__(data)是判断列表类型的data是否存在于字符串类型的line中,类型不匹配才触发TypeError,正确逻辑应该是判断行内包含的ID是否存在于目标ID列表中
纯Python无第三方依赖实现方案
直接遍历文件匹配即可,用集合存目标ID可以大幅提升查找效率,写法如下:
import requests # 第一步:获取目标ID列表,注意不要和其他变量重名,转成集合提升查找速度 response = requests.request("GET", url, headers=headers, data=payload) target_ids = set(response.json()["SkinsPanelLayout"]["SingleItemOffers"]) # 如果你的ID列表是从shopid.txt读取,替换上面的代码为下面的即可: # with open('shopid.txt', 'r', encoding='utf-8') as f: # target_ids = set(line.strip().strip("'\",[] ") for line in f if line.strip()) data_log = [] # 第二步:遍历文档B逐行匹配 with open('skin_database2.txt', 'r', encoding='utf-8') as f: for line in f: line_strip = line.strip() if not line_strip: continue # 提取每行末尾的ID(文档B所有行的ID都在最后一位) line_id = line_strip.split()[-1] if line_id in target_ids: print(line_strip) data_log.append(line_strip) print(data_log)
优化后的Pandas实现方案
你原来的Pandas写法有问题:文档B的行长度不统一,部分行有3个字段,直接指定两列的列名会导致数据错位,优化后写法如下:
import pandas as pd # 读取文档A的目标ID df1 = pd.read_csv('shopid.txt', header=None, names=['id']) target_ids = set(df1['id'].unique()) # 读取文档B的完整行,不拆分列 df2 = pd.read_csv('skin_database2.txt', header=None, names=['raw_line']) # 提取每行末尾的ID df2['line_id'] = df2['raw_line'].str.split().str[-1] # 筛选匹配的行 match_lines = df2[df2['line_id'].isin(target_ids)]['raw_line'].to_list() print(match_lines)
内容的提问来源于stack exchange,提问作者jerf
相关产品推荐
相关产品推荐

