我有一个文件,其中的每一行都包含我想读入词典的数据,从而产生了词典列表。或字典的字典,由每行的第一个元素作为键。每行的第一个元素是唯一可以保证行与行之间具有相同类型的元素,即它是一个名称。 文件中的数据如下所示:
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中中断。我当时正要使用:作为分隔符,但这感觉像是一种非常糟糕的形式,当我发送更多数据时,我无法自动将正确的逗号转换为冒号。有办法解决这个问题吗?
答案 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'}]