【发布时间】:2013-02-03 16:58:54
【问题描述】:
我有 unicode u"{'code1':1,'code2':1}",我想要字典格式。
我想要{'code1':1,'code2':1} 格式。
我试过unicodedata.normalize('NFKD', my_data).encode('ascii','ignore'),但它返回字符串而不是字典。
谁能帮帮我?
【问题讨论】:
标签: python unicode dictionary
我有 unicode u"{'code1':1,'code2':1}",我想要字典格式。
我想要{'code1':1,'code2':1} 格式。
我试过unicodedata.normalize('NFKD', my_data).encode('ascii','ignore'),但它返回字符串而不是字典。
谁能帮帮我?
【问题讨论】:
标签: python unicode dictionary
你可以使用内置的ast包:
import ast
d = ast.literal_eval("{'code1':1,'code2':1}")
帮助 ast 模块中的函数 literal_eval:
literal_eval(node_or_string)
安全地计算表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。
【讨论】:
您可以使用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)
【讨论】:
我从文件中读取 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()
【讨论】:
with 中有open() 语句时,无需调用close() 方法——它会在with 完成后自动发生。
您可以使用内置的eval函数将字符串转换为python对象
>>> string_dict = u"{'code1':1, 'code2':1}"
>>> eval(string_dict)
{'code1': 1, 'code2': 1}
【讨论】:
eval() 对正在执行的代码不提供任何限制或保护。例如,它会愉快地使用os 模块来重组文件夹、删除文件等。这是一个严重且危险的安全漏洞。另一方面,literal_eval 受到非常严格的限制。它只会在某些有限的表达式上起作用,这些表达式不会影响应用程序本身之外的任何内容。