Python将字符串转换为dict

Python将字符串转换为dict,python,string,dictionary,Python,String,Dictionary,我有一个字符串: '{tomatoes : 5 , livestock :{cow : 5 , sheep :2 }}' 我想把它转换成 { "tomatoes" : "5" , "livestock" :"{"cow" : "5" , "sheep" :"2" }" } 有什么想法吗?你有一个JSON格式的字符串,你想把它转换成python字典 使用JSON库: 现在,dictionary包含了您要查找的数据结构。输入字符串的问题是,它实际上不是有效的JSON,因为您的键没有声

我有一个字符串:

'{tomatoes : 5 , livestock :{cow : 5 , sheep :2 }}' 
我想把它转换成

{
  "tomatoes" : "5" , 
  "livestock" :"{"cow" : "5" , "sheep" :"2" }"
}

有什么想法吗?

你有一个JSON格式的字符串,你想把它转换成python字典

使用JSON库:
现在,dictionary包含了您要查找的数据结构。

输入字符串的问题是,它实际上不是有效的JSON,因为您的键没有声明为字符串,否则您可以使用
JSON
模块加载它并处理它

获取所需内容的一种简单而肮脏的方法是首先将其转换为有效的JSON,方法是在所有非空白或语法字符的内容周围添加引号:

source = '{tomatoes : 5 , livestock :{cow : 5 , sheep :2 }}'

output = ""
quoting = False
for char in source:
    if char.isalnum():
        if not quoting:
            output += '"'
            quoting = True
    elif quoting:
        output += '"'
        quoting = False
    output += char

print(output)  #  {"tomatoes" : "5" , "livestock" :{"cow" : "5" , "sheep" :"2" }}
这为您提供了一个有效的JSON,因此现在您可以使用
JSON
模块轻松地将其解析为Python
dict

import json

parsed = json.loads(output)
# {'livestock': {'sheep': '2', 'cow': '5'}, 'tomatoes': '5'}
以下是我的答案:

dict_str = '{tomatoes: 5, livestock: {cow: 5, sheep: 2}}'

def dict_from_str(dict_str):    

    while True:

        try:
            dict_ = eval(dict_str)
        except NameError as e:
            key = e.message.split("'")[1]
            dict_str = dict_str.replace(key, "'{}'".format(key))
        else:
            return dict_


print dict_from_str(dict_str)
我的策略是通过
eval
将字典
str
转换为
dict
。然而,我首先要处理的事实是,您的字典键没有包含在引号中。无论如何,我都是通过评估它并捕捉错误来实现的。从错误消息中,我提取了被解释为未知变量的密钥,并用引号将其括起来。

这已在中解决 简言之使用python
ast
库的
literal\u eval()
函数

import ast
my_string = "{'key':'val','key2':2}"
my_dict = ast.literal_eval(my_string)


你想把数字捕捉成字符串有什么原因吗?不一定,我想那样可能更容易。这有点自相矛盾。您无法将字符串更改为字典类型。。。您不能将类型更改为
dict
。这很有趣,我想知道这是怎么回事。。。JSON是一种很有用的方式,但是暴力硬编码方式如何?这是一种格式怪异的字典。它是从哪里来的?这是从Mac应用程序来的。我需要将其转换为真正的python dict,以便更快地访问。请注意,OPs字符串不是有效的JSON。键和值没有声明为stringsWhy JSON?为什么不干脆
parsed=eval(output)
?@innisfree-因为任何理智的人都不应该使用
eval
。即使是疯子在使用它之前也应该三思而后行。。。然后使用
ast.literal\u eval()。此外,它比
json.loads()
anyway.OK慢得多。为什么没有一个理智的人会使用它?@Innsfree-从开始,然后用单词
eval
危险的
坏习惯
慢的
等等来搜索,你会得到很多不应该使用它的理由。简言之,在99.999%的可能用例中,有一种更快、更好、更安全的解决方案,而不会让您的系统暴露在使用
eval()
@innsfree运行任意代码的危险中。这只是一个示例,OP已经通过键入问题将该字符串转换为他想要的任何字符串。可以安全地假设它将用于OP控制之外的任意字符串(否则他/她可能会强制使用最适合它们的格式),并且您不希望
eval()
接触任意字符串(这就是为什么大多数人无论如何都希望使用
eval()
)。我不确定破解错误消息是愚蠢还是聪明:人们倾向于对使用
eval
敏感,请记住
ast
模块中有一个名为的函数,它的评估范围大大缩小,因此更安全。@paul haha是的,我注意到;)这是可行的,但请小心,这将改变字典顺序。请使用@mwaks提供的数据,再试一次。哇,太棒了。谢谢,先生
import ast
my_string = "{'key':'val','key2':2}"
my_dict = ast.literal_eval(my_string)