#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 .