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

2024-09-30 06:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我要做的是检查CSV1的行,如果CSV2ID列与CSV1的行ID匹配,那么我希望保留该行。如果没有匹配项,那么我想从CSV1中删除该行。在

基本上,CSV1中的数据与我相关,但只与{}中的人有关。两者之间唯一的连接是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

我已经知道我没有走上正轨,有人能帮忙吗?在


Tags: csvinidforopenitemreaderrow
3条回答

您可以提取第二个文件中的所有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是否在集合中:

^{pr2}$

这假设CSV文件适合基于dict的读/写(即第一行是列名称的列表),但是如果列名称也来自其他信息,则很容易调整。在

根据您计划如何处理相关的数据行,您可能可以使用Python的内置^{}函数来完成您需要的操作:

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循环。在

相关问题 更多 >

    热门问题