Python CSV对比时相同IP协议的多条记录仅更新一条如何解决
问题根源
- 原有匹配逻辑仅判断了
IP和Protocol两个字段,没有加入Port作为匹配条件,无法区分同IP、同协议下端口不同的独立记录 - 内层遍历input列表的逻辑中,匹配到第一条符合条件的记录后就执行了
break,直接终止了当前search记录对应的input遍历,剩余同IP同协议的其他记录不会被处理,哪怕你手动加了Port匹配条件,这个break也会导致仅第一条符合条件的记录被更新
解决方案
我们可以先把search.csv中所有需要匹配的三元组(Protocol, IP, Port)存入集合,再遍历input.csv的所有记录批量判断,既避免嵌套循环的低效问题,也不会漏掉匹配项:
import csv IP, EXISTS, PROTOCOL, PORT = 'IP', 'Exists', 'Protocol', 'Port' # 读取input.csv所有记录 with open('input.csv', 'r', newline='') as inp: reader = csv.DictReader(inp) inputs = list(reader) # 先把search.csv的所有匹配条件存入集合,提升查询效率 search_match_set = set() with open('search.csv', 'r', newline='') as sea: sea_reader = csv.DictReader(sea) for row in sea_reader: # 存储三元组作为匹配标识 search_match_set.add((row[PROTOCOL], row[IP], row[PORT])) # 遍历所有input记录匹配更新 for input_ in inputs: current_key = (input_[PROTOCOL], input_[IP], input_[PORT]) if current_key in search_match_set: input_[EXISTS] = 'No' # 输出更新后的文件 with open('input_updated.csv', 'w', newline='') as outp: fieldnames = inputs[0].keys() writer = csv.DictWriter(outp, fieldnames=fieldnames) writer.writeheader() writer.writerows(inputs) print('done')
按照你提供的样例数据运行上述代码后,l1、l2、l3三条记录的Exists字段都会被设置为No,符合预期。
内容的提问来源于stack exchange,提问作者Fatilearns
相关产品推荐
相关产品推荐

