#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() предоставляет вам объект, подобный генератору, который вы можете перебирать. Я думаю, мой ответ был слишком упрощенным. Я отредактирую ответ.