2015-06-21 2 views
0

Я очень новичок в этом программировании на питоне. У меня два файла csv. Я должен просто объединить их, используя общее имя столбца. Я пробовал это, глядя на несколько других сообщений. Но не смог получить этот код, запущенный в моей версии python версии 2.5. Так может ли кто-нибудь помочь мне в этом. Файлы могут выглядеть этот результат файлаКак слить два файла 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]) 

Но ошибка, что я столкнулся is:

keys = set ((dict1.keys()) + (dict2.keys())) ТипError: неподдерживаемый тип операндов для +: 'dict_keys' и 'dict_keys'

Примечание: я установил версию python 3.4 сейчас.

Ваша помощь будет принята с благодарностью!

+2

Укажите код, который вы имеете до сих пор, и сказать нам, что именно происходит не так. Это прояснит ситуацию для людей, отвечающих на ваш вопрос. – Olga

+0

@Olga Я редактировал вопрос с кодом, который я пытался. Может ли помочь мне с этим? – rami92

ответ

0

Вы можете сделать это наиболее легко, используя функцию join от pandas. Если вы не можете установить панды, вы можете переопределить функции csv-загрузки и соединения в чистом питоне, но я думаю, что в конечном итоге вам будет лучше с пандами.

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

Вы можете поиграть с параметрами, чтобы read_table и join, чтобы получить именно поведение, которое вы хотите. Предполагая, что split_name является уникальным идентификатором для каждой строки в обоих файлах, вы, вероятно, захотите использовать его как «индекс» для обоих данных.

+0

Я не уверен, как легко было бы запустить pandas в 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 возвратного dictionary view для key() метода в отличие от Python 2.5.

Вы хотите получить соединение ключей от двух диктофонов. Вы можете сказать, что это 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)) 
       ) 
Смежные вопросы