В настоящее время я встраиваю свои данные во вложенный словарь из-за способа ввода и последующего использования данных, но я хочу написать читаемый "Сводный" csv на этом промежуточном шаге для целей отслеживания. Насколько я понимаю, словари не упорядочены, но, кажется, когда я использую эти функции dictWriter, порядок, кажется, имеет значение.
Я не могу скопировать мой точный код на этот компьютер, но так выглядит моя структура данных
myItems =
{
"Item1":
{
"Col1":"c1.1",
"Col2":"c2.1",
"Col3":"c3.1",
},
"Item2":
{
"Col1":"c1.2",
"Col3":"c3.2",
},
"Item3":
{
"Col1":"c1.3",
"Col4":"c4.3",
"Col5":"c5.3",
},
"Item4":
{
"Col3":"c3.4",
"Col2":"c2.4",
"Col1":"c1.4",
}
}
Я хотел бы, чтобы моя таблица выглядела следующим образом (без лишних пробелов, делая это для удобства чтения)
Item, Col1, Col2, Col3, Col4, Col5
Item1, c1.1, c2.1, c3.1
Item2, c1.2, , c3.2
Item3, c1.3, , , c4.3, c5.3
Item4, c1.4, c2.4, c3.4
Я мог бы написать функцию, которая индексирует через словари, собирает известные заголовки, преобразует его в список, вводит пустые записи, где ключи не представлены, и т.д., И т.д., Но может показаться, что Dictwriter будет иметь некоторую форму для приспособления к таким ситуациям путем добродетель того, чтобы быть разработанным для неупорядоченного письма.
Кроме того, если такой способ существует, я мог бы использовать его в другом месте в моей программе для распечатки сводок записей базы данных SQL, которые могут не использовать одни и те же таблицы.
Я все еще довольно плохо знаком с Python, поэтому я слышал о том, насколько мощными могут быть эти вложенные словари, поэтому, если бы я был перепродан по мощности вложенных словарей, я виню их болельщиков, если это невозможно. = Р
По умолчанию DictWriter использует пробелы для отсутствующих ключей. Если вы перебираете свои элементы и создаете словарь, который является копией оригинала с добавленным ключом Item
, вы получите желаемый результат. fieldnames
также должны быть указаны, чтобы обеспечить порядок записи в столбце.
import csv
myItems = {'Item1': {'Col1':'c1.1',
'Col2':'c2.1',
'Col3':'c3.1'},
'Item2': {'Col1':'c1.2',
'Col3':'c3.2'},
'Item3': {'Col1':'c1.3',
'Col4':'c4.3',
'Col5':'c5.3'},
'Item4': {'Col3':'c3.4',
'Col2':'c2.4',
'Col1':'c1.4'}}
with open('out.csv','w',newline='',encoding='utf-8-sig') as f:
w = csv.DictWriter(f,fieldnames='Item Col1 Col2 Col3 Col4 Col5'.split())
w.writeheader()
for k,v in myItems.items():
D = v.copy() # So myItems is not modified.
D['Item'] = k
w.writerow(D)
Выход:
Item,Col1,Col2,Col3,Col4,Col5
Item1,c1.1,c2.1,c3.1,,
Item2,c1.2,,c3.2,,
Item3,c1.3,,,c4.3,c5.3
Item4,c1.4,c2.4,c3.4,,
Обратите внимание, что utf-8-sig
- лучшая кодировка, если Excel будет использоваться для чтения файла. Он поддерживает Юникод правильно, хотя в этом случае использовались только ASCII-совместимые символы:
DictWriter
уже знает, как обрабатывать недостающие ключи. Параметрrestval
(по умолчанию - пустая строка,''
) используется в качестве значения по умолчанию для записи в столбец CSV, если ключ отсутствует.DictWriter
принимает последовательностьDictWriter
, которая представляет собой упорядоченную структуру данных, которая затем используется для определения порядка записи столбцов. Затем вы либо передаетеDictWriter
по одной строке за раз (упорядоченная операция, один вызов за другим), либо итерируемую строку (используя.writerows()
), что опять-таки является упорядоченной операцией. Таким образом,DictWriter
решил эту проблему,DictWriter
программиста предоставить заказ.