Python 使用dictwriter将字典嵌套到具有非统一(格式错误?)数据的CSV

Python 使用dictwriter将字典嵌套到具有非统一(格式错误?)数据的CSV,python,csv,dictionary,nested,Python,Csv,Dictionary,Nested,由于数据的输入和以后的使用方式,我目前正在将数据构建到一个嵌套字典中,但我希望在这个中间步骤中编写一个可读的“摘要”csv,以便于跟踪。据我所知,字典是无顺序的,但当我使用这些dictWriter函数时,顺序似乎很重要 我无法将我的确切代码复制到这台计算机上,但这就是我的数据结构 myItems = { "Item1": { "Col1":"c1.1", "Col2":"c2.1", "C

由于数据的输入和以后的使用方式,我目前正在将数据构建到一个嵌套字典中,但我希望在这个中间步骤中编写一个可读的“摘要”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",
        }
    }
我希望我的表格如下所示(没有额外的间距,这样做是为了可读性)

我可以编写一个函数,对字典进行索引,组合已知的标题,将其转换为列表,在没有表示键的地方输入空白条目,等等,但是Dictwriter似乎有某种形式的适应能力,因为它是为无序书写而设计的

另外,如果存在这种方法,我可以在程序的其他地方使用它来打印可能不共享相同表的SQL数据库条目的摘要


我对Python还是相当陌生的,所以我听说这些嵌套字典有多强大,所以如果我对嵌套字典的功能卖得太多,如果这不可能的话,我会责怪他们的啦啦队=P

DictWriter的默认设置是对缺少的键使用空格。如果您在项目上迭代并创建一个字典,该字典是添加了

Item
键的原始字典的副本,您将得到想要的结果<还必须指定代码>字段名,以提供列写入顺序

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,,
请注意,如果使用Excel读取文件,则最好使用
utf-8-sig
编码。它正确地支持Unicode,但在本例中仅使用了ASCII兼容字符:


DictWriter
已经知道如何处理丢失的钥匙。如果缺少键,
restval
参数(默认为空字符串,
'
)用作写入CSV列的默认值。请注意,
DictWriter
采用一系列字段名,这是一种有序的数据结构,然后用于确定写入列的顺序。然后,您可以一次给
DictWriter
一行(一个有序的操作,一个接一个的调用),或者给一个iterable行(使用
.writerows()
),这也是一个有序的操作。因此,
DictWriter
通过让程序员提供订单解决了这个问题。
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,,