我们有两个CSV文件:a.csv
和b.csv
。
a.csv
包含树列:标签, item1 , item2 。 b.csv
有两列: item1 , item2 。如果a.csv
中的 item1 和 item2 也出现在b.csv
中,则a.csv
和b.csv
具有相同的 item1 和 item2 ,a.csv
中标签的值应为 1 。
例如:
a.csv
:
label item1 item2
0 123 35
0 342 721
0 876 243
b.csv
:
item1 item2
12 35
32 721
876 243
result.csv
:
label item1 item2
0 123 35
0 342 721
1 876 243
答案 0 :(得分:1)
将您的a.csv
读入字典;使用(item1, item2)
元组作为键。然后,在阅读b.csv
时,您可以在处理文件时更新字典中每个条目的标签。
完成此过程后,请从字典中的信息中写出result.csv
。
import csv
rows = {}
with open('a.csv', 'r', newline='') as acsv:
areader = csv.DictReader(acsv)
for row in reader:
# store the row based on the item1 and item2 columns
key = (row['item1'], row['item2'])
rows[key] = row
with open('b.csv', 'r', newline='') as bcsv:
breader = csv.DictReader(bcsv)
for row in reader:
# set the label of matching rows to 1 when present
key = (row['item1'], row['item2'])
if key in rows:
rows[key]['label'] = 1
with open('result.csv', 'w', newline='') as result:
writer = csv.DictReader(result, fieldnames=areader.fieldnames)
writer.writerows(rows.values())
我使用csv.DictReader()
objects来简化列名处理。每行都显示为字典,其中的键取自CSV文件的第一行。
我还假设你使用的是Python 3;如果您使用的是Python 2,则必须调整open()
调用以删除newline=''
参数,并且需要使用二进制模式('rb'
和{{1} })。我没有为文件指定编解码器;目前,默认的系统编解码器将用于读写。如果这不正确,请添加'wb'
个参数。