Экспортируйте данные в CSV, но с разными наборами столбцов. Можно ли это сделать через библиотеку?

#python #csv #export

Вопрос:

Ввод данных:

 [
    {'a': 1, 'b': 2, 'c': 3},
    {'b': 2, 'd': 4, 'e': 5, 'a': 1},
    {'b': 2, 'd': 4, 'a': 1}
]
 

Вывод CVS (порядок столбцов не имеет значения):

 a, b, c, d, e
1, 2, 3
1, 2, ,  4, 5
1, 2, ,  4
 

Стандартный библиотечный csv модуль не может обрабатывать такой ввод.

Существует ли какой-либо пакет или библиотека для однометодного экспорта? Или хорошее решение для устранения несоответствий столбцов?

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

1. Проверьте, pandas.DataFrame.from_dict().to_csv() вам, вероятно, нужно будет заполнить пробелы с NaN помощью s или чего-то еще, но это было бы моей первой интуицией. В противном xlwings случае, вероятно, есть некоторые функции для этого, но я на самом деле не использовал их так часто.

Ответ №1:

Это можно сделать довольно легко, используя прилагаемый csv модуль с небольшой предварительной обработкой.

 import csv

data = [
    {'a': 1, 'b': 2, 'c': 3},
    {'b': 2, 'd': 4, 'e': 5, 'a': 1},
    {'b': 2, 'd': 4, 'a': 1}
]

fields = sorted(set.union(*(set(tuple(d.keys())) for d in data)))  # Determine columns.

with open('output.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=fields)
    writer.writeheader()
    writer.writerows(data)

print('-fini-')
 

Содержимое созданного файла:

 a,b,c,d,e
1,2,3,,
1,2,,4,5
1,2,,4,
 

Ответ №2:

Просто с pandas:

 import pandas as pd

lst = [
{'a': 1, 'b': 2, 'c': 3},
{'b': 2, 'd': 4, 'e': 5, 'a': 1},
{'b': 2, 'd': 4, 'a': 1}
]

df = pd.DataFrame(lst)
print(df.to_csv(index=None))
 

Вывод:

 a,b,c,d,e
1,2,3.0,,
1,2,,4.0,5.0
1,2,,4.0,
 

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

1. Кажется, это выполняет свою работу. Почему есть .0 ?

2. это потому, что pandas форматирует ячейки как float. Вы можете преобразовать каждую ячейку в int следующим образом: df = pd.DataFrame(lst).fillna(pd.NA).applymap(lambda x: x if pd.isna(x) else int(x))

Ответ №3:

вы должны передать аргумент restval в Dictwriter, который является аргументом по умолчанию для отсутствующих ключей в словарях

 writer = Dictwriter(file, list('abcde'), restval='')
 

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

1. Да, кажется, я это пропустил. Но все равно требуется указать все возможные столбцы, не так ли? fieldnames=...

2. да, это второй аргумент DictWriter .