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

Python实现CSV文件重复键的多值合并方案求助

解决CSV中同一客户端IP+服务组合的端口合并问题

看起来你想实现的是把CSV中相同client_ip和listener_service组合的listener_port合并成逗号分隔的字符串,同时要适配大文件、避免冗余的列表存储。我来帮你完善代码,并且优化方案的健壮性:

优化后的完整代码

import csv

with open('client.csv', 'r') as fin, open('client_out_file.csv', 'w', newline='') as ffout:
    reader = csv.reader(fin)
    writer = csv.writer(ffout)
    
    # 先处理表头,单独写入输出文件
    header = next(reader)
    writer.writerow(header)
    
    # 用元组作为键(比字符串拼接更安全,避免键冲突),值存储对应端口列表
    port_records = {}
    
    for row in reader:
        # 兼容不完整的行(比如输入最后一行只有两个字段)
        if len(row) == 2:
            client_ip, listener_port = row
            listener_service = ''
        elif len(row) >=3:
            client_ip, listener_service, listener_port = row
        else:
            # 跳过无效行(如果有的话)
            continue
        
        # 构建唯一键
        key = (client_ip, listener_service)
        
        # 记录端口
        if key not in port_records:
            port_records[key] = []
        port_records[key].append(listener_port)
    
    # 遍历字典,写入合并后的结果
    for (client_ip, listener_service), ports in port_records.items():
        merged_port = ','.join(ports)
        # 适配输入最后一行的特殊格式(无listener_service)
        if not listener_service:
            writer.writerow([client_ip, merged_port])
        else:
            writer.writerow([client_ip, listener_service, merged_port])

代码说明

  1. 表头单独处理:先读取表头并写入输出,避免把表头当成数据行处理
  2. 安全的键设计:用元组(client_ip, listener_service)作为字典键,比字符串拼接更可靠——比如避免client_ip="12"+listener_service="34"和client_ip="123"+listener_service="4"被误判为同一键的情况
  3. 兼容不完整行:针对输入中最后一行只有两个字段的情况做了适配,保证代码不会报错
  4. 流式+低内存占用:只存储唯一的组合键和对应的端口列表,内存占用取决于唯一组合的数量,而非整个CSV的行数,完美适配大文件
  5. 合并逻辑清晰:遍历完所有行后统一合并端口并写入,避免了边读边写导致的重复行问题(你的原始代码里边读边写会先输出未合并的行,后续无法修改)

为什么你的原始代码有问题?

你的代码在if nkey not in d时直接写入了行,但后续遇到相同键的行时,已经写入的内容无法修改,所以必须先把所有数据收集到字典中处理完成后,再统一写入输出文件。

内容的提问来源于stack exchange,提问作者RonyA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:43