将包含数组的文件的行转换为字典列表

时间:2018-06-28 03:29:36

标签: python

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

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)}
] 

关于将行读入单个字典或reading a file into a nested dictionary的元素,存在许多问题。他们都依靠逗号分隔行。即

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

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

1 个答案:

答案 0 :(得分:-1)

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'}]