如何使用csv模块删除重复项?

时间:2019-12-20 02:16:19

标签: python csv

我找不到基于第2列的删除重复行的方法。我查看了csv模块的文档,但看不到实现的任何内容。

我当前的输出,用于list-history.csv:

Number,Keywords
5,banana
8,apple
Number,Keywords
5,banana
Number,Keywords
5,banana
8,apple

所需的输出

Number,Keywords
5,banana
8,apple

并将新条目追加到所需的输出。

我尝试了另一种方法,但这是我发现的最接近的方法,没有提到第2列。从这一点上我真的不知道该怎么做。

with open("list-history.csv", "r") as f:
    lines = f.readlines()

with open("list-history.csv", "a", encoding="utf8") as f:
    reader = csv.reader(f)
    header = next(reader)
    for line in reader:
        if line.strip("\n") == "Number,Keywords":
            f.write(line)

但是此代码不会删除整列2中的其他重复项。我只想保留标题一次,并且没有重复项。我的约束是保持数据从文件1到文件2进入,文件2是关于上面代码的文件。

===解决的问题=======

import fileinput
seen = set() # set for fast O(1) amortized lookup
for line in fileinput.FileInput('1.csv', inplace=1):
    if line in seen: continue # skip duplicate

seen.add(line)
print(line, end='')

Removing duplicate rows from a csv file using a python script

4 个答案:

答案 0 :(得分:0)

我不知道是否允许您使用 csv 之外的其他模块;但是如果您这样做,可以使用 pandas 解决此问题。

import pandas as pd
df = pd.read_csv('list-history.csv')
df = df.drop_duplicates(subset=['Keywords'], keep='first')
print(df)

答案 1 :(得分:0)

  

删除所有重复值

data.drop_duplicates(subset ="Keywords",keep = False, inplace = True) 

答案 2 :(得分:0)

您可以按照以下两个步骤进行操作。 第一步,将文件的各行读取到collections.OrderedDict中,这将自动将重复项排除在文件之外。

第二步只是使用此字典的键覆盖文件。

from collections import OrderedDict
import csv

# 1. Read file into an OrderedDict which automatically removes any duplicates.
with open("list-history.csv", "r") as file:
    temp_dict = OrderedDict.fromkeys(line.strip() for line in file)

# 2. Rewrite file.
with open("list-history.csv", "w", newline='') as file:
    writer = csv.writer(file)
    for row in csv.reader(temp_dict):
        writer.writerow(row)

在Python 3.7+中,您可以使用常规词典,因为从该版本开始,它们还保持顺序。

答案 3 :(得分:0)

您需要保留到目前为止已经看到的几行,甚至不需要CSV阅读器:

with open("list-history.csv") as infile,
     open("list-history-copy.csv", "w", encoding="utf8") as outfile:
    lines = set()
    for line in infile:
        if line not in lines:
            data.add(lines)
            outfile.writeline(line + "\n")