2016-04-08 5 views
0

У меня есть три файла CSV с атрибутами Product_ID, Name, Cost, Description. Каждый файл содержит Product_ID. Я хочу совместить имя (файл1), стоимость (файл2), описание (файл3) с новым CSV-файлом с Product_ID и всеми тремя вышеуказанными атрибутами. Мне нужен эффективный код, так как файлы содержат более 130000 строк.Запись данных из одного csv в другой python

После объединения всех данных в новый файл я должен загрузить эти данные в словаре. Вроде: Product_Id как ключ и имя, стоимость, описание как значение.

+0

А что вы пробовали так фа р? Покажите нам свой код, чтобы мы могли помочь вам лучше. –

+0

Все, что я пробовал, - это объединить данные из трех файлов в словарь и затем написать их, но я получаю ошибку. В нижеприведенном коде я пишу файл в словарь со строкой [1] как ключ и строку [2], row [3] как значение. Но я не могу добавить другой файл в тот же словарь. с открытым ('train_1.csv', 'R', кодирование = "UTF-8") в качестве файла: text_file = csv.reader (файл) следующих (text_file) для строк в text_file: maindict [строка [1 ]] = строки [2], строки [3] – Sameer

+0

@Sameer Может захотеть отредактировать ваш вопрос с помощью этого кода, комментарии не совсем просты на глазах. – kirkpatt

ответ

1

Возможно, было бы лучше прочитать каждый вход .csv в словаре, прежде чем создавать сводный результат.

Вот решение для чтения в каждом файле и хранения столбцов в словаре с Product_IDs в качестве ключей. Я предполагаю, что каждое значение Product_ID существует в каждом файле и что заголовки включены. Я также предполагаю, что между файлами нет дубликатов столбцов, кроме Product_ID.

import csv 
from collections import defaultdict 

entries = defaultdict(list) 
files = ['names.csv', 'costs.csv', 'descriptions.csv'] 
headers = ['Product_ID'] 

for filename in files: 
    with open(filename, 'rU') as f:  # Open each file in files. 
     reader = csv.reader(f)   # Create a reader to iterate csv lines 
     heads = next(reader)    # Grab first line (headers) 

     pk = heads.index(headers[0])  # Get the position of 'Product_ID' in 
             # the list of headers 
     # Add the rest of the headers to the list of collected columns (skip 'Product_ID') 
     headers.extend([x for i,x in enumerate(heads) if i != pk]) 

     for row in reader: 
     # For each line, add new values (except 'Product_ID') to the 
     # entries dict with the line's Product_ID value as the key 
     entries[row[pk]].extend([x for i,x in enumerate(row) if i != pk]) 

writer = csv.writer(open('result.csv', 'wb')) # Open file to write csv lines 
writer.writerow(headers)       # Write the headers first 
for key, value in entries.items(): 
    writer.writerow([key] + value)  # Write the product IDs 
    # concatenated with the other values 
+0

если я хочу добавить более чем одну строку из CSV, тогда вышеуказанный код не будет работать. Предположим, что names.csv содержит Product_ID, Names, Tags. Если я хочу добавить как строку 1, row2 ?? – Sameer

+0

Вы не указали много информации о своих столбцах csv. Я предположил, что с ними не было других данных. Вы можете читать в заголовках с первой строки, а не пропускать их, чтобы найти правильные индексы строк для ключа и добавляемого значения. Чтобы уточнить, вы хотите, чтобы каждый столбец из каждого добавленного файла, с идентификатором продукта в качестве ключа? – dnix

+0

Я отредактировал свой ответ, чтобы включить каждый столбец из каждого файла. – dnix

0

общее решение, которое производит запись, может быть неполной, для каждого id он встречает обработки 3 файлов необходимо использование специализированной структуры данных, к счастью, это просто список, с наперед заданным числом слотов

d = {id:[name,None,None] for id, name in [line.strip().split(',') for line in open(fn1)]} 
for line in open(fn2): 
    id, cost = line.strip().split(',') 
    if id in d: 
     d[id][1] = cost 
    else: 
     d[id] = [None, cost, None] 
for line in open(fn3): 
    id, desc = line.strip().split(',') 
    if id in d: 
     d[id][2] = desc 
    else: 
     d[id] = [None, None, desc] 

for id in d: 
    if all(d[id]): 
     print ','.join([id]+d[id]) 
    else: # for this id you have not complete info, 
      # so you have to decide on your own what you want, I have to 
     pass 

Если вы уверены, что вы не хотите, чтобы дальнейший процесс неполных данных, код выше может быть упрощен

d = {id:[name] for id, name in [line.strip().split(',') for line in open(fn1)]} 
for line in open(fn2): 
    id, cost = line.strip().split(',') 
    if id in d: d[id].append(name) 
for line in open(fn3): 
    id, desc = line.strip().split(',') 
    if id in d: d[id].append(desc) 

for id in d: 
    if len(d[id])==3: print ','.join([id]+d[id]) 
+0

@ gboffi, я рассмотрю код сегодня, спасибо за помощь. – Sameer