将字符串转换为Python字典

4

我有一个字符串,内容如下:

my_string = '"sender" : "md-dgenie", "text" : "your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!", "time" : "1439155575925", "name" : "John"'

我希望能从上面的字符串中构建一个字典。我尝试了一些建议,如这里所示。
split_text = my_string.split(",")
for i in split_text :
    print i

然后我得到了以下输出:

"sender" : "md-dgenie"
 "text" : "your dudegenie code is 6632. welcome to the world of dudegenie! your wish
 my command!"     ### finds "," here and splits it here too.
 "time" : "1439155803426"
 "name" : "p"

我希望输出一个字典的键值对,如下所示:
my_dict = { "sender" : "md-dgenie",
     "text" : "your dudegenie code is 6632. welcome to the world of dudegenie! your wish, my command!",
     "time" : "1439155803426",
     "name" : "p" }

基本上,我想从句子中跳过“,”并构建一个字典。有任何建议都可以,非常感谢!

你确定你想要格式化 my_string 吗?我不知道那是否是一个有效的字符串,但是 Python 是一种奇怪的语言,可能有一些我不知道的模糊的字符串格式化方式。 - tobloef
请纠正您发布的代码。您的my_string不是字符串,也不是其他任何东西。它在语法上无效。 - Two-Bit Alchemist
@TobLoef:抱歉!我的错!我忘记在 my_string 上加单引号了。我已经更新了它。 - d-coder
4个回答

8

您的字符串已经几乎是一个Python字典了,所以您只需用大括号括起来,然后通过评估即可:

import ast
my_dict = ast.literal_eval('{{{0}}}'.format(my_string))

哦!这与 eval 有何不同? - d-coder
2
@d-coder ast.literal_eval 只是解析字符串并返回它,如果它评估为字面值,则不会实际执行它,因此不容易受到注入攻击的影响。 - tzaman
太棒了!它像魔法一样奏效了!我现在会给你一个徽章,因为我认为我不能点赞它。:P - d-coder
@d-coder,您可以通过点击复选标记来接受答案(您可能需要等待一会儿)。 - tzaman
不错的答案,但我有一个小建议:由于我们正在添加花括号,对于这个特定情况,.format()方法有点笨拙。我至少会考虑使用my_dict = ast.literal_eval('{' + my_string + '}') - John Y
显示剩余2条评论

2
my_string =' "sender" : "md-dgenie", "text" : "your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!", "time" : "1439155575925", "name" : "John"'
import re
print dict(re.findall(r'"([^"]*)"\s*:\s*"([^"]*)"',my_string))

你可以通过使用re.findall查找元组,并将其传递给dict来完成。

谢谢!但我想我会选择@tzaman的答案。我不擅长正则表达式! - d-coder
给你!:) 正则表达式让我感到不安! - d-coder
其实我还有一个问题。我应该更新这个问题还是发布另一个问题?我想知道如何将毫秒时间存储到Django模型字段中? - d-coder
@d-coder 如果你的新问题与解析类似字典字符串无关,请单独发布。 - tzaman

1
你也可以在",处进行分割,并去除空格和"
my_string = '"sender" : "md-dgenie", "text" : "your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!", "time" : "1439155575925", "name" : "John"'
print(dict(map(lambda x:x.strip('" ') ,s.split(":")) for s in my_string.split('",')))

{'name': 'John', 'time': '1439155575925', 'sender': 'md-dgenie', 'text': 'your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!'}

0
使用字典推导、更简单的正则表达式和 zip(*[iter()]*n) 的不同方法:
import re
my_string = '"sender" : "md-dgenie", "text" : "your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!", "time" : "1439155575925", "name" : "John"'
{k:v for k,v in zip(*[iter(re.findall(r'"(.+?)"',my_string))]*2)}

{'text': 'your dudegenie code is 6326. welcome to the world of dudegenie! your wish, my command!', 'sender': 'md-dgenie', 'name': 'John', 'time': '1439155575925'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接