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])
代码说明
- 表头单独处理:先读取表头并写入输出,避免把表头当成数据行处理
- 安全的键设计:用元组
(client_ip, listener_service)作为字典键,比字符串拼接更可靠——比如避免client_ip="12"+listener_service="34"和client_ip="123"+listener_service="4"被误判为同一键的情况 - 兼容不完整行:针对输入中最后一行只有两个字段的情况做了适配,保证代码不会报错
- 流式+低内存占用:只存储唯一的组合键和对应的端口列表,内存占用取决于唯一组合的数量,而非整个CSV的行数,完美适配大文件
- 合并逻辑清晰:遍历完所有行后统一合并端口并写入,避免了边读边写导致的重复行问题(你的原始代码里边读边写会先输出未合并的行,后续无法修改)
为什么你的原始代码有问题?
你的代码在if nkey not in d时直接写入了行,但后续遇到相同键的行时,已经写入的内容无法修改,所以必须先把所有数据收集到字典中处理完成后,再统一写入输出文件。
内容的提问来源于stack exchange,提问作者RonyA
相关产品推荐
相关产品推荐

