Python: запись в CSV с несколькими строками заголовков - PullRequest
0 голосов
/ 07 сентября 2018

Context

Я ищу экспорт словаря, который содержит список словарей в качестве значения каждого ключа: значения пары:

dict = {'key_1':
        [{'key_a': foo_1, 'key_b': bar_1}, 
         {'key_a': foo_2, 'key_b': bar_2}], 
        'key_2':
        [{'key_c': foo_1, 'key_d': bar_1}], 
         {'key_c': foo_2, 'key_d': bar_2}] 
        ...}

Требуемыйвыводом будет файл .csv, который содержит ключи первого словаря (key_1, key_2 и т. д.) в качестве первой строки заголовка, а затем ключи вложенных словарей (key_a, key_b и т. д.) в качестве второго заголовкастрока, соответствующая соответствующему ключу.

Пример желаемого вывода выглядит следующим образом: столбец индекса списка относится к данным, хранящимся в словаре по каждому соответствующему индексу в списке словарей:

╔════════════╦═══════════════╤═══════════════╗
║            ║     key_1     │     key_2     ║
║ List Index ╠═══════╤═══════╪═══════╤═══════╣
║            ║ key_a │ key_b │ key_c │ key_d ║
╠════════════╬═══════╪═══════╪═══════╪═══════╣
║     0      ║ foo_1 │ bar_1 │ foo_1 │ bar_1 ║
╟────────────╫───────┼───────┼───────┼───────╢
║     1      ║ foo_2 │ bar_2 │ foo_2 │ bar_2 ║
╟────────────╫───────┼───────┼───────┼───────╢
║     2      ║ foo_3 │ bar_3 │ foo_3 │ bar_3 ║
╚════════════╩═══════╧═══════╧═══════╧═══════╝

Платформа: Raspberry Pi 3b +, Python 3,6


Код

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

  • Используйте pandas для формирования массива, который отражает характер желаемой таблицы.Затем запишите это в CSV напрямую.

  • Запись в CSV из структуры данных словаря, описанной выше.

    import csv
    
    field_names = dict.keys()
    header2 = {'%s' %dict.keys() : dict[key_1][0].keys()}
    
    with open('project_data.csv', 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=field_names)
        writer.writeheader()  # Write header row containing the top field names
        writer.writerow(header2)  #Write row containing the second field names
    

    Как очевидно, этот код нуждается в доработке длязаставить его работать как нужно.

  • Другой метод, который я не рассматривал?


Вопрос

Каков наилучший подход для записи в CSV в этом формате?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Здесь ваш «индекс списка» - это объединенная ячейка, которую вы не можете получить в CSV-файле, потому что она не содержит форматирования. Вы можете либо:

a) Запишите его в файл xlsx ( XlsxWriter - отличная библиотека для этого)

b) Сохраняйте, чтобы это был CSV, но с необработанной ячейкой, как предполагает anky_91

0 голосов
/ 07 сентября 2018

до сих пор я достиг здесь:

d = {'key_1':
    [{'key_a': 'foo_1', 'key_b': 'bar_1'}, 
     {'key_a': 'foo_2', 'key_b': 'bar_2'}], 
    'key_2':
    [{'key_c': 'foo_1', 'key_d': 'bar_1'}, 
     {'key_c': 'foo_2', 'key_d': 'bar_2'}]}
df = pd.DataFrame(d)
df1 = []
for col in df.columns:
    data = df[col].apply(pd.Series)
    data = df1.append(data)
df1 = pd.concat(df1,axis=1)
print(df1)

, что дает вам:

  key_a   key_b    key_c     key_d
0 foo_1   bar_1    foo_1     bar_1 
1 foo_2   bar_2    foo_2     bar_2 

Остальное, вы должны сопоставить соответствующие ключи в отношении ваших исходных имен столбцов, и их можно поместить в df1.loc[-1] в качестве идентификатора. Я обновлю, как только получу что-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...