加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何将嵌套字典的列表写入csv文件?

发布时间:2020-12-20 13:38:22 所属栏目:Python 来源:网络整理
导读:我是 Python的新手,尝试了我能想到的所有东西,无法找到解决方案. 我有一个列表,其中包含一个字典,具有不同数量的键,作为其最后一项,看起来像. l = [('Apple',1,2,{'gala': (2,1.0)}),('Grape ',4,{'malbec': (4,0.25),'merlot': (4,0.75)}),('Pear',5,{'anjo
我是 Python的新手,尝试了我能想到的所有东西,无法找到解决方案.
我有一个列表,其中包含一个字典,具有不同数量的键,作为其最后一项,看起来像.

l = [('Apple',1,2,{'gala': (2,1.0)}),('Grape ',4,{'malbec': (4,0.25),'merlot': (4,0.75)}),('Pear',5,{'anjou': (5,0.2),'bartlet': (5,0.4),'seckel': (5,0.2)}),('Berry',{'blueberry': (5,'blackberry': (5,'straw': (5,0.2)})]

当我尝试从当前列表中编写.csv文件时,我使用了:

test_file = ()
length = len(l[0])

with open('test1.csv','w',encoding = 'utf-8') as test_file:
    csv_writer = csv.writer(test_file,delimiter=',')
    for y in range(length):
        csv_writer.writerow([x[y] for x in l])

它使列表中的最后一个元素(字典)只是输出文件中的一个字符串:

Apple   1   2   {'gala': (2,1.0)}
Grape   2   4   {'malbec': (4,0.75)}
Pear    4   5   {'anjou': (5,'bosc': (5,0.2)}
Berry   5   5   {'blueberry': (5,0.2)}

这使得无法使用最后一项内的值进行任何操作.

我试图压扁嵌套字典,所以我只得到一个简单的列表,但结果不保留项目之间的关系.我需要的是拆分字典并有一个看起来像这样的输出:

Apple   1   2   gala        2   1.0
Grape   2   4   malbec  4   0.25
            merlot      4   0.75
Pear    4   5   anjou       5   0.2
            bartlet     5   0.4
            seckel      5   0.2
            bosc        5   0.2
Berry   5   5   blueberry   5   0.2
            blackberry  5   0.2
            straw       5   0.2

我的意思有点像这样,因为我没有承诺这种格式,而是认为字典的层次关系不会在输出文件中丢失.有办法吗?我是python的新手,感谢任何帮助.谢谢!

解决方法

假设您必须将其存储在CSV中,并且dict中每个项目有一行,以下显示了如何编写和读取它.如果您拥有大量数据,这不是有效的,也不是最佳的,因为它会重复每行中的数据,但是它会很好地压缩.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""csv_dict.py
"""
import csv
import pprint
from collections import namedtuple


Row = namedtuple('Row',[
    'name','value_1','value_2','extra_name','extra_value_1','extra_value_2'
])


l = [
    ('Apple',{
        'anjou': (5,0.2)}
    ),{
        'blueberry': (5,0.2)
    })
]

print('List before writing: ')
pprint.pprint(l)

# Writing the data.
with open('test1.csv','wb') as fout:
    writer = csv.writer(fout)

    for row in l:
        for k,v in row[3].iteritems():
            writer.writerow(row[0:3] + (k,) + v)

# Reading the data.
format_extra = lambda row: (int(row.extra_value_1),float(row.extra_value_2))

with open('test1.csv','rU') as fin:
    reader = csv.reader(fin)

    ll = []
    hl = {}

    for row in (Row(*r) for r in reader):
        if row.name in hl:
            ll[hl[row.name]][3][row.extra_name] = format_extra(row)
            continue

        ll.append(row[0:3] + ({
            row.extra_name: format_extra(row)
        },))
        hl[row.name] = len(ll) - 1

    pprint.pprint(ll)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读