问 如何将一个字典字符串转换成字典;
user_info='{"name" : "rianley", "gender" : "male", "age": 18}'
最简单的方式;用json转换一下呗;代码如下;
>>> import json >>> user_info= '{"name" : "rianley", "gender" : "male", "age": 18}' >>> user_dict = json.loads(user_info)
但是使用 json
进行转换存在一个潜在的问题。
由于 json
语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号 (官网上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此下面的转换是错误的:
就是 类似于下面的dict字符串转换是会出现错误的
user_info="{'name' : 'rianley', 'gender' : 'male', 'age': 18}"
通过 eval
>>> user_info = '{"name" : "rianley", "gender" : "male", "age": 18}' >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 18, 'name': 'rianley'} >>> user_info = "{'name' : 'rianley', 'gender' : 'male', 'age': 18}" >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 18, 'name': 'rianley'}
通过 eval
进行转换就不存在上面使用 json
进行转换的问题。但是,使用 eval
却存在安全性的问题
,比如下面的例子:
# 让用户输入 `user_info` >>> user_info = raw_input('input user info: ') # 输入 {"name" : "john", "gender" : "male", "age": 28},没问题 >>> user_dict = eval(user_info) # 输入 __import__('os').system('dir'),user_dict 会列出当前的目录文件! # 再输入一些删除命令,则可以把整个目录清空了! >>> user_dict = eval(user_info)
通过 ast库中的literal_eval函数
>>> import ast >>> user = '{"name" : "rianley", "gender" : "male", "age": 18}' >>> user_dict = ast.literal_eval(user) >>> user_dict {'gender': 'male', 'age': 28, 'name': 'john'} user_info = "{'name' : 'rianley', 'gender' : 'male', 'age': 18}" >>> user_dict = ast.literal_eval(user) >>> user_dict {'gender': 'male', 'age': 18, 'name': 'rianley'}
使用 ast.literal_eval
进行转换既不存在使用 json
进行转换的问题,也不存在使用 eval
进行转换的 安全性问题
,因此推荐使用 ast.literal_eval
。
每天记录一个小知识.....