You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:30:04