如何用Python移除CSV文件中指定列重复的行?代码遇死循环
嘿,我来帮你搞定这个问题!先拆解下你遇到的麻烦,再给你高效的解决方案。
先说说你代码里的问题
- 索引搞混了:你提到的「第1、第5、第13列」,在Python的
csv.reader里是从0开始计数的,所以对应的应该是row[0]、row[4]、row[12]——你代码里用的row[1]其实是第二列,这会直接导致去重逻辑判断错误。 - 死循环的根源:你嵌套遍历
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
相关产品推荐
相关产品推荐

