Python: Как создать строку csv (без файла) из списка словарей? - PullRequest
0 голосов
/ 08 октября 2019

В Python у меня есть список словарей, подобных этому:

[
    {
        "col2": "2",
        "id": "1",
        "col3": "3",
        "col1": "1"
    },
    {
        "col2": "4",
        "id": "2",
        "col3": "6",
        "col1": "2"
    },
    {
        "col1": "1",
        "col2": "4",
        "id": "3",
        "col3": "7"
    }
]

, и мне нужно преобразовать это в строку в формате csv, включая строку заголовка. (Для начала давайте не будем заботиться о разделителях столбцов и строк ...) Итак, в идеале результат будет:

id,col1,col2,col3
1,1,2,3
2,2,4,6
3,1,4,7

(«в идеале», потому что порядок столбцов на самом деле не имеет значения; наличие «id»)Первый столбец был бы хорош, хотя ...)

Я искал SOF, и есть ряд похожих вопросов, но ответы всегда включают создание файла CSV с использованием csv.DictWriter. Я не хочу создавать файл, я просто хочу эту строку!

Конечно, я мог бы зациклить список и внутри этого цикла за ключами словаря и таким образом создать строку csv, используя строкуоперации. Но наверняка должен быть какой-то более элегантный и эффективный способ сделать это?

Кроме того, я знаю о библиотеке Pandas, но я пытаюсь сделать это в очень ограниченной среде, где я предпочел бы использовать тольковстроенные модули.

Ответы [ 4 ]

3 голосов
/ 08 октября 2019

Самый простой способ - использовать панд:

import pandas as pd
df = pd.DataFrame.from_dict(your_list_of_dicts)
print(df.to_csv(index=False))

Результат:

col1,col2,col3,id
1,2,3,1
2,4,6,2
1,4,7,3

Если вы хотите изменить порядок столбцов, ничего проще:

col_order = ['id', 'col1', 'col2', 'col3']
df[col_order].to_csv(index=False)

или, чтобы убедиться, что столбец id является первым:

df.set_index('id', inplace=True) # the index is always printed first
df.to_csv() # leave the index to True this time
2 голосов
/ 08 октября 2019

Со встроенными функциями:

from collections import OrderedDict

ord_d = OrderedDict().fromkeys(('id', 'col1', 'col2', 'col3'))
s = ','.join(ord_d.keys()) + '\n'
for d in lst:
    ord_d.update(d)
    s += ','.join(ord_d.values()) + '\n'

print(s)

Выход:

id,col1,col2,col3
1,1,2,3
2,2,4,6
3,1,4,7
0 голосов
/ 08 октября 2019

Вы можете использовать io.StringIO для записи в «строку» вместо файла. На примере csv.DictWriter мы получаем следующий код:

import csv
import io

data = [...]  # your list of dicts

with io.StringIO() as csvfile:
    fieldnames = ['id', 'col1', 'col2', 'col3']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for row in data:
        writer.writerow(row)
    print(csvfile.getvalue())
0 голосов
/ 08 октября 2019

Идея состоит в том, чтобы получить все возможные ключи и получить все значения. Предположим, данные - это список диктовок, которые у вас есть. Это должно работать:

output = ''
all_keys = set().union(*(d.keys() for d in data))
output += ",".split(all_keys) + '\n'
for item in data:
    item_str = ",".split([data[key] for key in all_keys if key in data else ''])
    output += item_str + '\n'

источник

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