使用dictwriter

时间:2019-01-08 18:06:57

标签: python csv dictionary nested

由于数据输入和稍后使用的方式,我目前正在将数据构建到嵌套字典中,但是我希望在此中间步骤中编写可读的“摘要” 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还是很陌生,所以我听说这些嵌套词典的功能有多强大,因此,如果我对嵌套词典的功能超卖了,我就怪罪他们的啦啦队长。 = P

1 个答案:

答案 0 :(得分:-1)

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,,

请注意,如果将使用Excel读取文件,则utf-8-sig是最好的编码。尽管在这种情况下仅使用了ASCII兼容字符,但它正确支持Unicode:

Excel image of opened CSV file