在python中将unicode字符串字典转换为字典

在python中将unicode字符串字典转换为字典,python,unicode,dictionary,Python,Unicode,Dictionary,我有unicodeu“{'code1':1,'code2':1}”,我希望它是字典格式的 我希望它是{'code1':1,'code2':1}格式 我尝试了unicodedata.normalize('NFKD',my_data.encode('ascii','ignore'),但它返回的是字符串而不是字典 有人能帮我吗?你可以使用literal\u eval。您可能还希望确保您正在创建一个dict,而不是其他内容。使用自己的错误处理,而不是断言 from ast import literal_

我有unicode
u“{'code1':1,'code2':1}”
,我希望它是字典格式的

我希望它是
{'code1':1,'code2':1}
格式

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


有人能帮我吗?

你可以使用
literal\u eval
。您可能还希望确保您正在创建一个dict,而不是其他内容。使用自己的错误处理,而不是断言

from ast import literal_eval
from collections import MutableMapping

my_dict = literal_eval(my_str_dict)
assert isinstance(my_dict, MutableMapping)

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

>>> string_dict = u"{'code1':1, 'code2':1}"
>>> eval(string_dict)
{'code1': 1, 'code2': 1}

您可以使用内置的
ast
软件包:

import ast

d = ast.literal_eval("{'code1':1,'code2':1}")
有关模块ast中函数文字评估的帮助:

文字值(节点或字符串)

安全地计算表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、数字、元组、列表、dicts、boolean和None


编辑:结果证明我的假设是错误的;因为键没有用双引号(“)包装,所以字符串不是JSON

我猜您可能有一个JavaScript对象表示法

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

import json
result = json.loads(u"{'code1':1,'code2':1}")   # will NOT work; see above

当我从一个文件中读取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()
导入ast
job1={}
将open('hostdata2.json')作为f:
job1=json.load(f.read())
f、 关闭()
#从unicode转换为dic之前的打印类型为
打印类型(作业1)
job1=ast.literal\u eval(job1)
打印“ast后打印类型”
打印类型(作业1)
#这应该是结果
对于作业1中的每项:
打印每个
打印“打印密钥”
打印作业1.keys()
打印“打印值”
打印作业1.values()

有人曾经告诉我,eval是邪恶的。用literal\u eval来代替。@pyrosapde为什么会这样?@Ishanmahajan,
eval()
对正在执行的代码不提供任何限制或保护。例如,它很乐意使用
os
模块来重新组织文件夹、删除文件等。这是一个严重而危险的安全缺陷。
literal\u u eval
另一方面受到严格限制。它只能在某些有限的表达式上运行如果我有类似于{u'a':{u'nstext':u'(文章),u'title':u'Article title',u'namespace':u'0',u'len':u'4339',u'touch':u'20140829055924',u'id':u'28621',u'n':u'page',这个答案给了我ValueError错误:格式错误的字符串在我尝试时出错(像往常一样,我什么也做不到):语法错误:解析时出现意外的EOF,文件“”,第1700000^@LawrenceDeSouza行看起来您的文件有问题,而不是我的答案。不明白为什么您需要对其进行否决,但这取决于您。这是我最终使用的代码,看起来像:data_meta=json.loads(str(myjsonstring))也许你的代码不是针对字符串的,而是针对文件的。天哪,我一直在拼命寻找类似的东西!在我的例子中效果很好。当你在
中使用
打开()
语句时,就不需要调用
关闭()
method——一旦
with
完成,它就会自动发生。