Вложенные словари в CSV с неоднородными (искаженными?) Данными с использованием dictwriter

1

В настоящее время я встраиваю свои данные во вложенный словарь из-за способа ввода и последующего использования данных, но я хочу написать читаемый "Сводный" 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, поэтому я слышал о том, насколько мощными могут быть эти вложенные словари, поэтому, если бы я был перепродан по мощности вложенных словарей, я виню их болельщиков, если это невозможно. = Р

  • 0
    DictWriter уже знает, как обрабатывать недостающие ключи. Параметр restval (по умолчанию - пустая строка, '' ) используется в качестве значения по умолчанию для записи в столбец CSV, если ключ отсутствует.
  • 0
    Обратите внимание, что DictWriter принимает последовательность DictWriter , которая представляет собой упорядоченную структуру данных, которая затем используется для определения порядка записи столбцов. Затем вы либо передаете DictWriter по одной строке за раз (упорядоченная операция, один вызов за другим), либо итерируемую строку (используя .writerows() ), что опять-таки является упорядоченной операцией. Таким образом, DictWriter решил эту проблему, DictWriter программиста предоставить заказ.
Теги:
csv
dictionary
nested

1 ответ

0

По умолчанию 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-совместимые символы:

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню