2015-06-21 87 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)) 
       )