Python:如何从另一个csv文件更新csv文件

时间:2015-04-02 12:46:03

标签: python csv

我们有两个CSV文件:a.csvb.csv

a.csv包含树列:标签 item1 item2 b.csv有两列: item1 item2 。如果a.csv中的 item1 item2 也出现在b.csv中,则a.csvb.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

1 个答案:

答案 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'个参数。