2015-07-05 6 views
3

Мне был предоставлен большой файл CSV, который мне нужно разбить для использования в машинах. Мне удалось найти способ разделения файла на две строки, которые мне нужны, но у меня есть проблема.Как объединить несколько строк в CSV в одну строку

У меня в основном такая файловая структура.

"David", "Red" 
"David", "Ford" 
"David", "Blue" 
"David", "Aspergers" 
"Steve", "Red" 
"Steve", "Vauxhall" 

И я требую, чтобы данные выглядеть следующим образом ...

"David, "Red", "Ford", "Blue", "Aspergers" 
"Steve", "Red", "Vaxhaull" 

я в настоящее время это обирать файлы CSV

import csv 

cr = csv.reader(open("traits.csv","rb"), delimiter=',', lineterminator='\n') 
cr.next() #skipping header line, no point in removing it as I need to standardise data manipuation. 


# Print out the id of species and trait values 
print 'Stripping input' 
vals = [(row[1], row[4]) for row in cr] 
print str(vals) + '\n' 

with open("output.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(vals) 
    print 'Sucessfully written to file output.csv' 


#for row in cr: 
#print row 

ответ

4

Используйте словарь для хранения имен в качестве ключа и других атрибутов в списке в качестве значения:

my_dict={} 
with open("traits.csv","rb") as f: 
    cr = csv.reader(f, delimiter=',', lineterminator='\n') 
    for row in cr: 
     my_dict.setdefault(row[0].strip('" '),[]).append(row[1].strip('" ')) 

результат:

print my_dict 
{'Steve': ['Red', 'Vauxhall'], 'David': ['Red', 'Ford', 'Blue', 'Aspergers']} 

И для записи в новом файле:

with open("output.csv", "wb") as f: 
    writer = csv.writer(f,delimiter=',') 
    for i,j in my_dict.iteritems(): 
     writer.writerow([i]+j) 

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

+0

В настоящее время я получаю вывод. 'AttributeError: объект 'list' не имеет атрибута 'setdefault' – KeironO

+0

@KeironO Возможно, у вас есть список с именем' d' (и определено после d = {} '), я меняю его имя! попробуйте отредактированный ответ! – Kasramvd

+0

Я все еще смущен тем, как я могу интегрировать это в свою собственную программу. Кажется, он работает, но не распечатывает 4-й ряд? (только 1-й) – KeironO

0

Использование defaultdict, это именно то, что вам нужно, вот пример:

>>> from collections import defaultdict 
>>> md = defaultdict(list) 
>>> md[1].append('a') 
>>> md[1].append('b') 
>>> md[2].append('c') 
>>> md[1] 
['a', 'b'] 
>>> md[2] 
['c'] 



(Вместо списка вы можете использовать set, в этом случае вы, d call .add вместо .append.)

Вы можете использовать iteritems для легкого доступа к данным.

Смежные вопросы