簡體   English   中英

如何使用特定列比較另一個CSV中的行,從而刪除一個CSV中的行

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

我有兩個CSV1文件和CSV2 CSV文件,具有多個列和行。 列之一標題為ID

我想要做的是檢查CSV1的行,如果有一個IDCSV2ID列匹配CSV1的行ID ,然后我想保持該行。 如果沒有匹配項,那么我想從CSV1刪除該行。

基本上CSV1的數據與我有關,但僅與CSV2的人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,並在每次檢查第一個文件的某一行時查找它們。

例如:

# 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] 

根據您打算對相關數據行進行處理的方式,您也許可以使用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()函數的結果。

首先,閱讀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文件適合基於dict的讀/寫(即,第一行是列名的列表),但是如果列名也來自其他信息,則很容易進行調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM