2015-06-25 20 views
0

У меня есть главная таблица, содержащая некоторые поля. Я хочу присоединиться к нему с кучей других csvs.Join Multiple Files Dictionary

Текущие данные выглядит следующим образом:

Файл 1:

Key Attrib1 Attrib2 Attrib3 Attrib4 

Файл 2:

Key Attrib5 

Файл 3:

Key Attrib6 

Я хочу, чтобы мой последний выход смотреть например:

Key Attrib1 Attrib2 Attrib3 Attrib4 Attrib5 Attrib6, etc. 

Не все файлы содержат все ключи.

Текущий код:

master = "in.csv" 
file1 = "file.csv" 
file2 = "file2.csv" 
prime = list() 
D1 = {} 

with open(master) as f: 
    for k in csv.reader(f): 
     prime.append(k[0]) 

for k in prime: 
    with open(file1,'r') as csvfile: 
     rd = csv.reader(csvfile,delimiter=",") 
     for row in rd: 
      if row[0] ==k: 
       D1 = dict((row[0],row[1]) for rows in rd) 
    with open(file2,'r') as csvfile: 
     rd = csv.reader(csvfile,delimiter=",") 
     for row in rd: 
      if row[0] ==k: 
       D1 = D1+dict((row[0],row[1]) for rows in rd) 
+0

файлов 1, что вы называете 'master' в коде? Если нет, как это выглядит? – martineau

+0

Как узнать, какие атрибуты находятся в других файлах? У каждого есть только один? – martineau

+0

Да, файл 1 - это то, что я называю мастером. Внешний вид: Ключ Attrib1 Attrib2 Attrib3 Attrib4 –

ответ

1

Я думаю, что это делает близко, если не совсем то, что вы хотите:

master = "in.csv" 
filelist = "file.csv", "file2.csv" 
joined = "joined.csv" 
dict1 = {} 

with open(master, 'r') as csvfile: 
    for row in csv.reader(csvfile): 
     key = row[0] 
     dict1[key] = row[1:] # note this does not check for duplicate keys 

for filename in filelist: 
    with open(filename, 'rb') as csvfile: 
     seen = set() 
     for row in csv.reader(csvfile): 
      key = row[0] 
      if key in dict1: 
       if key in seen: 
        print('Error: duplicate key %r in file %r - ignored' % 
            (key, filename)) 
       else: 
        dict1[key].append(row[1]) 
        seen.add(key) 
      else: # key not in master 
       pass # ignore  

     # add null entry for any keys not present in this file 
     for key in dict1: 
      if key not in seen: 
       dict1[key].append(None) 

# write the data in the merged dictionary into a new csv file 
with open(joined, 'wb') as newcsvfile: 
    csv.writer(newcsvfile).writerows(
     ([key]+attrlist) for key, attrlist in sorted(dict1.iteritems())) 
+0

Красивые !!!! Прекрасно работает. Моя единственная забота теперь записывает его в мой файл csv. –

+0

См. Обновление, в котором показано, как это сделать. – martineau

0

Идея заключается в том, чтобы открыть все три файла и записать их в новый файл .csv. Общая идея, как я бы идти о присоединении CSV файлов будет что-то вроде этого:

import glob 
import csv 

# gets all the files in your dictionary that end with .csv 
csv_files = glob.glob('*.csv') 

     # create the new csv file, which will be your output 
     with open('filename.csv', 'w') as outfile: 
       writer = csv.writer(outfile, delimiter = ',') 

       for csv_file in csv_files: 
        with open(csv_file) as infile: 
         reader = csv.reader(infile, delimiter = ',') 
         for row in reader: 
          writer.writerow(row) 

Вы должны управлять тем, что именно «строка» состоит из, чтобы сделать его соответствие с тем, как ваши работы данных (создание пустых столбцов на данные, которые не имеют требуемых столбцов).

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

for row in reader: 

    if csv_file == 'file1': 
     # '' represents a blank field in column 
     data_to_write = (row[0], row[1], '', row[2]) 

    elif csv_file == 'file2': 
     data_to_write = '', row[0], row[1],row[2] 

    writer.writerow(data_to_write)