2015-10-20 41 views
2

说有使用词典的多行文件的字典值项,使用绳子

{"apple": "red", "oarange": "orange", "pear": "green"} 

从这个字符串被抓获,对

>>> input = '"apple": "red", "oarange": "orange", "pear": "green"' 
>>> input 
'"apple": "red", "oarange": "orange", "pear": "green"' 

,当然,我可以很容易地捕获它作为

>>> input = '{"apple": "red", "oarange": "orange", "pear": "green"}' 
>>> input 
'{"apple": "red", "oarange": "orange", "pear": "green"}' 

无论如何,我希望采取输入,并使其成为一个新的字典的新价值,所以,使用两种不同的方法,不工作,

>>> mydict['plate1'] = input 
>>> mydict['plate2'] = {input} 

产生不良

>>> mydict 
{'test': set(['"user_name": "BO01", "password": "password", "attend_password": "BO001"']), 'plate1': '"apple": "red", "oarange": "orange", "pear": "green"'} 

既不希望的,其中

'plate1' : {"apple": "red", "oarange": "orange", "pear": "green"} 

人知道如何取输入字符串,使其作为父字典的字典值可以很好地发挥作用吗?

回答

2

您可以尝试采用分体式及钢带,但我包裹在字符串中括号,并呼吁ast.literal_eval最简单的方法:

from ast import literal_eval 

inp = '"apple": "red", "oarange": "orange", "pear": "green"' 


d = literal_eval("{{{}}}".format(inp)) 

输出:

{'pear': 'green', 'oarange': 'orange', 'apple': 'red'} 

你几乎有一个字典与'"apple": "red", "oarange": "orange", "pear": "green"',我们唯一缺少的是括号,所以使用"{{{}}}"与str.format包装在括号中的字符串允许我们拨打literal_eval

在附注中,如果您在文件中有字符串,并且实际上字符串来自您的位置,则应直接输入json.loadsliteral_eval

+0

Tapadh真皮休闲。现在,我刚刚走了,看着'literal_eval'的pydoc,我不明白''{{{}}}''的作用。你能否在答案中解释一下? –

+0

我会接受你的建议并直接从文件中加载,但当然每行中还有其他垃圾需要分解。 –

+1

我加了一点解释,当你在字符串本身中使用'{}'时,它们必须被转义,所以你需要使用'“{{{}}}”',内在就是你通过格式化外部括号只是逃避另一个。如果你在文件中有垃圾,只想要有效的行是dicts,你可以用try/expect来捕捉坏行 –

2

您可以使用这样一个事实,即使用split('"')可为您提供战略位置中字典的键和值。利用这一点,一个可能的解决办法是:

input = '{"apple": "red", "oarange": "orange", "pear": "green"}' # Your input 
words = input.split('"') 
fruits = words[1::4] # Location of keys 
colors = words[3::4] # Location of values 

d = dict(zip(fruits, colors)) # Create the dictionary 
d = {'plate1': d} # Make that dictionary a value of the key 'plate1' 

d则是:

{'plate1': {'pear': 'green', 'oarange': 'orange', 'apple': 'red'}}