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
模块轻松地将其解析为Pythondict
:
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
。然而,我首先要处理的事实是,您的字典键没有包含在引号中。无论如何,我都是通过评估它并捕捉错误来实现的。从错误消息中,我提取了被解释为未知变量的密钥,并用引号将其括起来。这已在中解决
简言之使用pythonast
库的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)