首页 > 解决方案 > 将包含数组的文件的行转换为字典列表

问题描述

我有一个文件,其中每一行都包含我想读入字典的数据,从而产生一个字典列表。或字典字典,以每行的第一个元素为键。每行的第一个元素是唯一一个我可以保证从一行到另一行的类型相同的元素,即它是一个名称。文件中的数据如下所示:

name:value1, var2:('str1', 'str2','str3'), var3:[0.1,1,10] , var4:range(1,10)
name:value2, var5:('str1', 'str2'), var6:range(1,10)

我想让它最终变成这样:

dictionaryList=[
{"name": "value1", "var2":('str1', 'str2','str3'), var3:[0.1,1,10] , var4:range(1,10)},
{name:value2, var5:('str1', 'str2'), var6:range(1,10)}
] 

关于将行读入单个字典的元素或将文件读入嵌套字典有很多问题。不过,它们都依赖于用逗号分隔行。IE

content = f.readlines()
    for line in content:
        line = line.strip('\r').strip('\n').split(':')

如果我这样做,我最终会在范围和数组和 wotnot 中出现中断。我本来打算使用 : 作为分隔符,但这感觉像是非常糟糕的形式,当我收到更多数据时,我无法自动将正确的逗号转换为冒号。有没有办法解决这个问题?

标签: python

解决方案


f = open("test.txt","r")
lines = f.readlines()
f.close()
dictList = []
stack = []
brack = "([{"
opbrack = ")]}"
for line in lines:
    d = {}
    key = ""
    val = ""
    k = 0
    for i in line:
        if i == ',':
            if not(stack) or stack[-1] not in brack:
                d[key] = val
                key = ""
                val = ""
                k = 0
            elif k==0:
                key += i
            else:
                val += i
        elif i in brack:
            stack.append(i)
            if k==0:
                key += i
            else:
            val += i
        elif i in opbrack:
            stack.pop()
            if k==0:
                key += i
            else:
                val += i
        elif i == ":":
             if not(stack) or stack[-1] not in brack:
                k = 1
            elif k==0:
                key += i
            else:
                val += i
        else:
            if k==0:
                key += i
            else:
                val += i
    dictList.append(d)
print dictList

这段代码应该做你需要的。它假定文件已经是正确的格式。

这是输出:

[{'name': 'value1', ' var2': "('str1', 'str2','str3')", ' var3': '[0.1,1,10] '}, {' var5': "('str1', 'str2')", 'name': 'value2'}]

推荐阅读