Объединение двух файлов csv после того, как я использовал dictreader

#dictionary #export-to-csv #opencsv

#словарь #экспорт в csv #opencsv

Вопрос:

Я новичок в Python и пытаюсь взять около 30 файлов csv, все с одинаковыми заголовками, но с разными данными в каждом файле, и объединить их в один. На данный момент я притворяюсь, что у меня есть только два файла для приема, один с информацией об идентификационных номерах 1,2 и 3, а другой с информацией о 4,5 и 6. Пока мне удалось взять файлы и использовать dictreader для создания набора словарей с одинаковыми ключами, но я могуне получается понять, как взять значения, соответствующие каждому ключу, и объединить их в один большой файл со всеми данными вместе.

Вот как далеко я продвинулся до сих пор 🙂

 for filename in os.listdir(os.getcwd()):
  root, ext = os.path.splitext(filename)
  if root.startswith('file1') and ext == '.csv':
      upload1 = filename
  if root.startswith('file2') and ext == '.csv':
      upload2 = filename

file_upload1 = open(upload1, 'rU')
data_upload1 = csv.DictReader(file_upload1)

for row in data_upload1:
  print row
  

И то же самое для upload2. И затем я получаю такой результат;

 {'ID': '1', 'name': 'bert', 'age': '30'}
{'ID': '2', 'name': 'ernie', 'age': '40'}
{'ID': '3', 'name': 'pinky', 'age': '50'}
{'ID': '4', 'name': 'perky', 'age': '60'}
etc
  

И то, что я хотел бы сделать, это один файл csv с одним столбцом для идентификаторов 1,2,3,4,5,6, а затем столбец для каждого соответствующего имени, и каждый соответствующий возраст и т.д.

Может кто-нибудь, пожалуйста, подсказать, как я мог бы этого добиться? Извините за вопрос новичка.

Ответ №1:

Вы получите генератор dicts при вызове csv.DictReader(). Допустим, у нас есть 2 файла: «f1.csv» и «f2.csv», и каждый из них содержит несколько записей.

 
    import csv

    fp1, fp2 = open("f1.csv"), open("f2.csv")
    ld1, ld2 = csv.DictReader(fp1), csv.DictReader(fp2) #ld1 and ld2 are *generators*

    res = []  #our result will be stored here(LIST of dicts)
    ds = [ld1, ld2]    #list of generators
  

затем выполните итерацию по ds, добавляя каждую пару k-v из каждого dict в res dict, вот так:

 for d in ds: #each d is a generator
    for e in d: #each e is a dict
        res.append(e)
  

Теперь это res -список, который содержит dicts из обоих источников. Просто выполните итерацию по нему и запишите их.

Обратите внимание, что вы можете сделать код более надежным / эффективным, но сначала просто поймите метод 🙂

с уважением,

Яти Сагаде

Комментарии:

1. Привет! Большое спасибо за ответ на мой вопрос! Я попробовал то, что вы предложили, но получил следующую ошибку. Вы знаете, что я сделал не так? Что-то связано с тем, как объект создается с помощью dictreader? Трассировка (последний последний вызов): файл «merge_bulk_v2.py «, строка 30, в <модуле> res[ключ] = d[ключ] Ошибка атрибута: экземпляр DictReader не имеет атрибута ‘ getitem ‘ Еще раз спасибо за вашу помощь 🙂

2. Я думаю, вы запутались 🙂 См. DictReader() предоставляет вам объект, подобный генератору, который вы можете перебирать. Я думаю, мой ответ был слишком упрощенным. Я отредактирую ответ.