Вложенные словари в CSV с неоднородными (искаженными?) Данными с использованием dictwriter - PullRequest
0 голосов
/ 08 января 2019

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

1 Ответ

0 голосов
/ 09 января 2019

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-совместимые символы:

Excel image of opened CSV file

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