2015-06-21 56 views
0

我对这个python编程很新。我有两个csv文件。我必须使用公共列名称来合并它们。我一直在试着看其他几个帖子。但无法让我的2.5版本的Python中运行的代码。所以任何人都可以帮我解决这个问题 文件可能看起来像这样如何合并两个csv文件与python 2.5版本中的公共列

File1 
split_name, vcc, temp, c 
A, 1,2,1 
B,2,3,5 

File 2 
split_name, cout, i, vout 
A, 2.5,2, 1 
B, 2.4,1,8 

结果文件应该是这样的

split_name,vcc,temp,c,cout,i,vout 
A,   1, 2, 1, 2.5,2,1 
B,   2, 3, 5, 2.4,1,8 

认为我想的代码是:

import csv 
import array 
import os 

#def readfile2(file2name): 
r = csv.reader(open('file1.csv','r')) 
dict2 = {row[0]: row[1:] for row in r} 
print str(dict2) 
#print dict2.keys() 

#def readfile1(file1name): 
reader1 = csv.reader(open('file2.csv','r')) 
for row in reader1: 
    dict1 = {row[0]: row[1:]} 
    #print str(dict1) 
    #print dict1.values() 
    print str(dict1) 



keys = set(dict1.keys() + dict2.keys()) 
with open('output.csv', 'wb') as f: 
    w = csv.writer(f, delimiter=',') 
    w.writerows([[key, dict1.get(key, "''"), dict2.get(key, "''")] for key in keys]) 

但是,我也遇到了错误是:

keys = set((dict1.keys())+(dict2.keys ())) TypeError:不支持的操作数类型为+:'dict_keys'和'dict_keys'

注意:我已经安装了python 3.4版本。

您的帮助将不胜感激!

+2

请提供你有这么远的代码,并告诉我们究竟是怎么了。它会为回答你的问题的人澄清事情。 – Olga

+0

@Olga我用我试过的代码编辑了这个问题。可以帮我解决吗? – rami92

回答

0

您可以使用pandasjoin函数最简单地完成此操作。如果你不能安装熊猫,你可以在纯python中重新实现csv加载和加入功能,但是我认为从长远来看你最好用熊猫。

import pandas 
df1 = pandas.read_table('file1.csv') 
df2 = pandas.read_table('file2.csv') 
joined = df1.join(df2) 

您可以用参数玩到read_tablejoin,达到您想要的行为。假设split_name是两个文件中每行的唯一标识符,您可能希望将其用作这两个数据帧的“索引”。

+0

我不确定在Python 2.5中运行熊猫是多么容易。 – DSM

+0

@cxrodgers我试过使用熊猫。但我得到错误,没有模块名称熊猫。你能让我知道其他方式来做到这一点吗? – rami92

+0

@cxrodgers我现在已经安装了3.4版本。但不能用熊猫来完成。 – rami92

1

首先,最好是坚持使用特定版本的python。

你得到这个错误 TypeError: unsupported operand type(s) for +: 'dict_keys' and 'dict_keys' 因为Python 3不像Python 2.5的key()方法的返回dictionary view

你想从两个字符中获得密钥的联合。你可以说那到Python这样:

set(dict1.keys()) | set(dict2.keys()) 

其中|运营商是两套工会。

为了解决你的任务应该重写最后一行,所以writerows()得到的字符串列表作为参数,而不是列表的列表。我认为使用for周期代替列表理解会更好。

下面是一些改变和评论的Python 3代码:

import csv 

reader1 = csv.reader(open('file1.csv','r')) 
titles1 = next(reader1) # First row is titles. So we parse it separetly 
dict1 = {row[0]: row[1:] for row in reader1} 

reader2 = csv.reader(open('file2.csv','r')) 
titles2 = next(reader2) 
dict2 = {} # If we skipt this and do nto change behaviour in cilce we 
      # will get only last row every time 
for row in reader2: 
    dict2[row[0]] = row[1:] 

keys = set(dict1.keys()) | set(dict2.keys()) 
with open('output.csv', 'w', newline='') as f: # For CVS it's beeter to use 
               # text mode, not binary. 
    w = csv.writer(f, delimiter=',') 

    w.writerow(titles1 + titles2) 
    for key in keys: 
     w.writerow([key, ] + 
       dict1.get(key, [''] * (len(titles1)-1)) + 
       dict2.get(key, [''] * (len(titles2)-1)) 
       ) 
相关问题