如何根据使用特定列进行比较的另一个 CSV 中的行删除一个 CSV 中的行
How do I delete rows in one CSV based on rows in another CSV using specific columns to compare
我有两个 CSV 文件,CSV1
和 CSV2
,有多个列和行。其中一列标题为 ID
.
我想做的是检查 CSV1
的行,如果 CSV2
的 ID
列中有 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()
函数的结果。
我有两个 CSV 文件,CSV1
和 CSV2
,有多个列和行。其中一列标题为 ID
.
我想做的是检查 CSV1
的行,如果 CSV2
的 ID
列中有 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()
函数的结果。