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

如何用Python移除CSV文件中指定列重复的行?代码遇死循环

嘿,我来帮你搞定这个问题!先拆解下你遇到的麻烦,再给你高效的解决方案。

先说说你代码里的问题

  1. 索引搞混了:你提到的「第1、第5、第13列」,在Python的csv.reader里是从0开始计数的,所以对应的应该是row[0]、row[4]、row[12]——你代码里用的row[1]其实是第二列,这会直接导致去重逻辑判断错误。
  2. 死循环的根源:你嵌套遍历newrows的写法不仅效率极低(时间复杂度O(n²)),如果不小心把newrows.append(row)写在了内层循环里,会导致newrows不断变长,内层循环永远跑不完,直接陷入死循环。

高效的去重实现方案

推荐用集合记录已出现的唯一键,只需要遍历CSV一次就能完成去重,时间复杂度O(n),完全不会有死循环问题。

代码示例(保留第一次出现的行)

import csv

# 对应你说的第1、5、13列,注意Python是0索引
KEY_COLUMNS = (0, 4, 12)

seen_keys = set()
new_rows = []

# 用with语句自动管理文件,避免资源泄漏
with open("items4.csv", "r", newline="") as infile:
    reader = csv.reader(infile)
    # 先读取表头并保留
    header = next(reader)
    new_rows.append(header)
    
    for row in reader:
        # 把指定列的值组合成元组(元组可哈希,能存在集合里)
        unique_key = tuple(row[col] for col in KEY_COLUMNS)
        if unique_key not in seen_keys:
            seen_keys.add(unique_key)
            new_rows.append(row)

# 写入去重后的新文件
with open("items4_deduplicated.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerows(new_rows)

如果需要保留最后一次出现的重复行

用字典来存储,后面的重复行会直接覆盖前面的:

import csv

KEY_COLUMNS = (0, 4, 12)

row_dict = {}

with open("items4.csv", "r", newline="") as infile:
    reader = csv.reader(infile)
    header = next(reader)
    for row in reader:
        unique_key = tuple(row[col] for col in KEY_COLUMNS)
        row_dict[unique_key] = row  # 后续重复行覆盖之前的

# 整理成最终的行列表
new_rows = [header] + list(row_dict.values())

with open("items4_deduplicated_last.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerows(new_rows)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:19:29