我想根据字段合并两个CSV文件 第一个看起来像这样:
ID, field1, field2
1,a,green
2,b,white
2,b,red
2,b,blue
3,c,black
第二个看起来像:
ID, field3
1,value1
2,value2
我想要的是:
ID, field1, field2,field3
1,a,green,value1
2,b,white,value2
2,b,red,value2
2,b,blue,value2
3,c,black,''
我在eclipse上使用pydev
import csv
endings0=[]
endings1=[]
with open("salaries.csv") as book0:
for line in book0:
endings0.append(line.split(',')[-1])
endings1.append(line.split(',')[0])
linecounter=0
res = open("result.csv","w")
with open('total.csv') as book2:
for line in book2:
# if not header line:
l=line.split(',')[0]
for linecounter in range(0,endings1.__len__()):
if( l == endings1[linecounter]):
res.writelines(line.replace("\n","") +','+str(endings0[linecounter]))
print("done")
答案 0 :(得分:3)
你正在做的事情有很多问题
你应该真的 真的使用csv
模块中的类来读写csv文件。导入模块是不够的。你实际上需要调用它的函数
您永远不应该找到自己输入endings1.__len__()
。请改用len(endings1)
您永远不会发现自己键入for linecounter in range(0,len(endings1))
使用for linecounter, _ in enumerate(endings1)
,
或者更好for end1, end2 in zip(endings1, endings2)
字典是一种比一对并行列表更好的查找数据结构。引用pike:
如果您选择了正确的数据结构并组织好的事情,算法几乎总是不言而喻。
我是这样做的:
import csv
with open('second.csv') as f:
# look, a builtin to read csv file lines as dictionaries!
reader = csv.DictReader(f)
# build a mapping of id to field3
id_to_field3 = {row['ID']: row['field3'] for row in reader}
# you can put more than one open inside a with statement
with open('first.csv') as f, open('result.csv', 'o') as fo:
# csv even has a class to write files!
reader = csv.DictReader(f)
res = csv.DictWriter(fo, fieldnames=reader.fieldnames + ['field3'])
res.writeheader()
for row in reader:
# .get returns its second argument if there was no match
row['field3'] = id_to_field3.get(row['ID'], '')
res.writerow(row)
答案 1 :(得分:0)
我有一个高级解决方案。
将您的第一个CSV反序列化为dict1
映射ID到包含包含field1和field2的列表的列表。
将第二个CSV反序列化为dict2
映射ID到field3。
对于dict1
中的每个(ID,列表),执行list.append(dict2.setdefault(id, ''))
。现在使用您之前使用的任何序列化程序将其序列化为CSV。
我使用了字典setdefault
,因为我注意到ID 3位于第一个CSV文件中,但不是第二个。