Список списка словарей для CSV - PullRequest
0 голосов
/ 03 декабря 2018

Я знаю, что могу написать список словарей непосредственно в файл CSV.Аналогично, существует ли прямой способ записать список списков словарей в файл csv в python, не просматривая каждую строку вручную?

Пример данных

[[{'e': 46, 'p': 100, 'n': 0, 'a': 100, ...}, 
  {'e': 29, 'p': 40, 'n': 1, 'a': 40, ...}, ...],
 [{...}, ...]

Ожидаемый формат

e,p,n,a,....
46,100,0,100,....
29,40,1,40,...
.......

Примечание это несписок словарей, но список словарей

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Если словари имеют одинаковый формат, просто сгладьте список следующим образом (при условии, что это действительно список списков, двумерный):

data = [
    [{'a': 10, 'b': 20, 'c': 30}],
    [{'a': 20, 'b': 30, 'c': 40},
     {'a': 30, 'b': 40, 'c': 50}]
]
rows = [item for sublist in data for item in sublist]

Затем просто запишите свои строки в CSV:

with open('my_data.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, rows[0].keys())
    dict_writer.writeheader()
    dict_writer.writerows(rows)

Комбинация двух следующих постов:

Как сделать плоский список из списка списков?

Какпреобразовать этот список словарей в CSV-файл?

0 голосов
/ 03 декабря 2018

Без Pandas вы можете использовать itertools.chain, чтобы получить сводный список всех словарей, а затем записать это в свой CSV-файл с помощью csv.DictWriter:

import csv
from itertools import chain

data = [
    [{'e': 46, 'p': 100, 'n': 0, 'a': 100}, 
     {'e': 29, 'p': 40, 'n': 1, 'a': 40}],
    [{'e': 56, 'p': 200, 'n': 23, 'a': 10}, 
     {'e': 22, 'p': 41, 'n': 11, 'a': 420}]]

fieldnames = ['e', 'p', 'n', 'a']
with open('mydata.csv', 'w') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(chain.from_iterable(data))

Вывод (mydata.csv)

e,p,n,a
46,100,0,100
29,40,1,40
56,200,23,10
22,41,11,420
0 голосов
/ 03 декабря 2018

Если вы хотите, чтобы набор ключей был объединением всех словарей в списке списка диктов, то вы можете сделать что-то вроде этого:

import csv
x = \
[[{'e': 46, 'p': 100, 'n': 0, 'a': 100},
  {'e': 29, 'p': 40, 'n': 1, 'a': 40}],
 [{'e': 19, 'p': 10, 'n': 1, 'a': 10, 'b':8}]]

key_dict = {}
for l in x:
    for d in l:
        for k in d:
            key_dict[k] = None

with open('file.csv', 'w') as csvfile:
    writer = csv.DictWriter(csvfile, key_dict.keys())
    writer.writeheader()
    for l in x:
        for d in l:
            writer.writerow(d)

Результат:

a,p,b,e,n
100,100,,46,0
40,40,,29,1
10,10,8,19,1
0 голосов
/ 03 декабря 2018

Должен быть способ выполнить вашу задачу, используя только ядро ​​Python, но я бы выбрал Pandas:

import pandas as pd
d = yourListOfListsOfDictionaries
df = pd.concat(map(pd.DataFrame, d), sort=True)
#     a   e  n    p
#0  100  46  0  100
#0   40  29  1   40
df.to_csv(index=False)
#'a,e,n,p\n100,46,0,100\n40,29,1,40\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...