首页 > 解决方案 > 将文本文件打印为字典 python

问题描述

我正在处理的文本文件

3:d:10:i:30
1:d:10:i:15
4:r:30
1:r:15
2:d:12:r:8
4:l:20
5:i:15
3:l:20:r:22
4:d:30
5:l:15:r:15

我正在尝试从一个文本文件中打印一个字典,它应该看起来像:

{1: {'d': 10, 'i': 15, 'r': 15},
2: {'d': 12, 'r': 8},
3: {'d': 10, 'i': 30, 'l': 20, 'r': 22},
4: {'d': 30, 'l': 20, 'r': 30},
5: { 'i': 15, 'l': 15, 'r': 15}}

相反,我的代码覆盖了文件中的每一行,并且只将最近的行作为字典中的值,所以它看起来像:

 {'3': {'l': '20', 'r': '22'}, 
 '1': {'r': '15'}, 
 '4': {'d': '30'}, 
 '2': {'d': '12', 'r': '8'}, 
 '5': {'l': '15', 'r': '15'}})

这是我到目前为止所拥有的

def read_db(file):
d = defaultdict(dict)
for line in open('db1.txt'):
    z = line.rstrip().split(':')
    d[z[0]]=dict( zip(z[1::2],z[2::2]))
print(d)

我尝试做 += 但该操作数不适用于字典。我有点卡住了。谢谢你的帮助

标签: pythonfiledictionary

解决方案


这是一种使用简单迭代和dict.setdefault.

前任:

res = {}
with open(filename) as infile:           #Open file to read
    for line in infile:                  #Iterate Each line 
        line = line.strip().split(":")   #Split by colon
        res.setdefault(line.pop(0), {}).update(dict(zip(line[::2], line[1::2])))    

print(res)

输出:

{'1': {'d': '10', 'i': '15', 'r': '15'},
 '2': {'d': '12', 'r': '8'},
 '3': {'d': '10', 'i': '30', 'l': '20', 'r': '22'},
 '4': {'d': '30', 'l': '20', 'r': '30'},
 '5': {'i': '15', 'l': '15', 'r': '15'}}

或使用collections.defaultdict

前任:

from collections import defaultdict
res = defaultdict(dict)
with open(filename) as infile:
    for line in infile:
        line = line.strip().split(":")
        res[line.pop(0)].update(dict(zip(line[::2], line[1::2])))

print(res)

输出:

defaultdict(<class 'dict'>,
            {'1': {'d': '10', 'i': '15', 'r': '15'},
             '2': {'d': '12', 'r': '8'},
             '3': {'d': '10', 'i': '30', 'l': '20', 'r': '22'},
             '4': {'d': '30', 'l': '20', 'r': '30'},
             '5': {'i': '15', 'l': '15', 'r': '15'}})

推荐阅读