基于两列删除 csv 文件中的重复项?

Remove duplicates in a csv file based on two columns?

我有一个 CSV 文件,必须读取它并在写入之前删除重复值。

重复值将基于两列(日期、价格)(AND 条件语句)。因此,在下面的示例中,第 1 行、第 2 行和第 4 行将写入 CSV。第 3 行有资格作为重复项(因为相同的日期和价格与第 1 行匹配)并且将被排除(不写入 CSV)。

address      floor       date         price
40 B STREET    18        3/29/2015    2200000
40 B STREET    23        1/7/2015     999000
40 B STREET    18        3/29/2015    2200000
40 B STREET    18        4/29/2015    2200000

您可以使用 set 来保留写入的行并在每次迭代检查中,如果该行已写入则不要写入它,并使用 tempfile.NamedTemporaryFile 重写您的文件:

import csv
from tempfile import NamedTemporaryFile
import shutil

seen=set()
tempfile = NamedTemporaryFile(delete=False)

with open('file_name.csv', newline='') as csvfile:
     spamreader = csv.reader(csvfile, delimiter='\t')
     spamwriter = csv.writer(csvfile, delimiter='\t')
     for row in spamreader:
         date=row[2]
         if date not in seen:
            spamwriter.writerow(row)
         seen.add(date)
shutil.move(tempfile.name, file_name)

您可以使用 DictReaderDictWriter 来完成您的任务。

import csv

def main():
"""Read csv file, delete duplicates and write it."""
    with open('test.csv', 'r',newline='') as inputfile:
        with open('testout.csv', 'w', newline='') as outputfile:
            duplicatereader = csv.DictReader(inputfile, delimiter=',')
            uniquewrite = csv.DictWriter(outputfile, fieldnames=['address', 'floor', 'date', 'price'], delimiter=',')
            uniquewrite.writeheader()
            keysread = []
            for row in duplicatereader:
               key = (row['date'], row['price'])
               if key not in keysread:
                   print(row)
                   keysread.append(key)
                   uniquewrite.writerow(row)

if __name__ == '__main__':
    main()

虽然不在标准库中,pandas 非常适合这类事情:

import pandas as pd
records = pd.read_csv('test.csv')
deduped = records.drop_duplicates(['date', 'price'])
deduped.to_csv('deduped.csv', index=False)

这种方法的缺点是所有数据都被一次性读入内存。但是,如果您的数据集适合内存,那么增加清晰度和表现力可能是值得的 - 特别是如果您要像这样对表格数据进行额外操作。