53

我有 unicode u"{'code1':1,'code2':1}",我想要字典格式。

我想要它的{'code1':1,'code2':1}格式。

我试过unicodedata.normalize('NFKD', my_data).encode('ascii','ignore')了,但它返回字符串而不是字典。

谁能帮我?

4

5 回答 5

89

您可以使用内置ast包:

import ast

d = ast.literal_eval("{'code1':1,'code2':1}")

关于 ast 模块中函数 literal_eval 的帮助:

文字评估(节点或字符串)

安全地评估表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

于 2013-02-19T05:19:49.663 回答
16

您可以使用literal_eval. 您可能还想确保您正在创建一个 dict 而不是其他东西。而不是assert,使用您自己的错误处理。

from ast import literal_eval
from collections import MutableMapping

my_dict = literal_eval(my_str_dict)
assert isinstance(my_dict, MutableMapping)
于 2013-02-19T05:19:04.967 回答
12

编辑:原来我的假设是不正确的;因为键没有包含在双引号 (") 中,所以字符串不是 JSON。 有关此问题的一些方法,请参见此处

我猜你所拥有的可能是JSON,也就是 JavaScript Object Notation。

您可以使用 Python 的内置json模块来执行此操作:

import json
result = json.loads(u"{'code1':1,'code2':1}")   # will NOT work; see above
于 2014-04-08T09:31:15.850 回答
2

从文件中读取 json 时出现 unicode 错误。所以这个对我有用。

import ast
job1 = {}
with open('hostdata2.json') as f:
  job1= json.loads(f.read())

f.close()

#print type before converting this from unicode to dic would be <type 'unicode'>

print type(job1)
job1 =  ast.literal_eval(job1)
print "printing type after ast"
print type(job1)
# this should result <type 'dict'>

for each in job1:
 print each
print "printing keys"
print job1.keys()
print "printing values"
print job1.values()
于 2018-01-29T22:57:01.303 回答
0

您可以使用内置eval函数将字符串转换为 python 对象

>>> string_dict = u"{'code1':1, 'code2':1}"
>>> eval(string_dict)
{'code1': 1, 'code2': 1}
于 2013-02-19T05:19:44.340 回答