如何根据使用特定列进行比较的另一个 CSV 中的行删除一个 CSV 中的行

How do I delete rows in one CSV based on rows in another CSV using specific columns to compare

我有两个 CSV 文件,CSV1CSV2,有多个列和行。其中一列标题为 ID.

我想做的是检查 CSV1 的行,如果 CSV2ID 列中有 ID 匹配 CSV1 的行 ID,那么我想保留该行。如果没有匹配项,那么我想从 CSV1.

中删除该行

基本上 CSV1 中的数据与我相关,但只有 CSV2 中的人。两者之间的唯一联系是 ID 列。所以我需要检查 CSV1 中的所有行,看看 ID 行是否在 CSV2.

中的一行中

这是我目前所拥有的。

import csv
smarteeCSV = open("Smartee.csv", "r")
aeriesCSV = open("aeriesEditable.csv", "r+")

aeries = csv.reader(aeriesCSV, delimiter=',')##CSV1
smartee = csv.reader(smarteeCSV, delimiter=',')##CSV2    

for row in aeries:
    for item in smartee
    if row[1] != item[1]##indexes for the columns with the ids

我已经知道我走的路不对,所以有人可以帮忙吗?

您可以提取第二个文件中的所有 ID,并在每次检查第一个文件的其中一行时查找这些 ID。

例如:

# extract ID column from CSV file 2 into a set
Ids = { row[1] for row in smartee }

# pick only rows whose ID is in Ids 
filtered_rows = [item for item in aeries if item[1] in Ids] 

首先,阅读 CSV2 以制作一组 ID:

with open(CSV2) as f:
    r = csv.DictReader(f)
    theids = set(row['ID'] for row in r)

然后,在读取 CSV1 时,只需检查 ID 是否在集合中:

with open(CSV1) as f, open(CSV1 + '.new', 'w') as out:
    r = csv.DictReader(r)
    w = csv.DictWriter(out, r.fieldnames)
    for row in r:
        if row['ID'] in theids:
            w.writerow(row)

这假定 CSV 文件适用于基于字典的 read/write(即第一行是列名列表),但如果列名也来自其他信息,则很容易调整。

根据您计划对相关数据行执行的操作,您可以使用 Python 的内置 filter() 函数来执行您需要的操作:

import csv

# first get the ids    
with open('Smartee.csv', 'rb') as smarteeCSV:  # CSV2
    ids = set(row['ID'] for row in csv.DictReader(smarteeCSV, delimiter=','))

with open('aeriesEditable.csv', 'rb') as aeriesCSV:  # CSV1
    relevant = filter(lambda row: if row['ID'] in ids,
                        csv.DictReader(aeriesCSV, delimiter=','))

# relevant will be a list containing the desired rows from CSV1

如果您想迭代处理行,对于第二部分,您可以使用 for 循环遍历调用 itertools.ifilter() 函数的结果。