2015-04-02 122 views
0

我们有两个CSV文件:a.csvb.csvPython:如何从另一个csv文件更新csv文件

a.csv有树列:标签物品1ITEM2b.csv有两列:item1,item2。如果a.csv物品1ITEM2也occurr在b.csv,这是a.csvb.csv具有相同物品1ITEM2标签a.csv值应来代替。

例如:

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

结果可以写入一个新的csv文件“result.csv” – 2015-04-02 12:48:03

+1

你试过了什么? – 2015-04-02 12:50:00

回答

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''wb')。我没有指定文件的编解码器;目前默认的系统编解码器将用于读取和写入。如果这不正确,请添加encoding='...'参数。

+0

如何使用(item1,item2)的元组作为键?我是Python的新手 – 2015-04-02 13:01:33

+0

@HuanRen:我已经在我的答案中包含了代码。 – 2015-04-02 13:03:57

+0

我使用Python3,我运行你的代码,结果显示一个错误:KeyError:key =(row [1],row [2])。 – 2015-04-02 13:16:18