2018-07-22-14-Python如何将字符串转为字典
2019-03-24 00:06
435 查看
Python 如何将字符串转为字典
1 通过json转换
>>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]}) >>> errors "{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}" >>> errors_dict = {"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]} >>> errors_dict {'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]} >>> import json >>> errors_dic1 = json.loads(errors) Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> errors_dic1 = json.loads(errors) File "E:\locate_app\develop\Python3\lib\json\__init__.py", line 354, in loads return _default_decoder.decode(s) File "E:\locate_app\develop\Python3\lib\json\decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "E:\locate_app\develop\Python3\lib\json\decoder.py", line 355, in raw_decode obj, end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
但是使用
json进行转换存在一个潜在的问题。
由于
json语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号 (官网上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此上面的转换是报错。
2 通过eval转换
>>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]}) >>> errors "{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}" >>> errors_dic2 = eval(errors) >>> errors_dic2 {'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]} >>> type(errors_dic2) <class 'dict'>
通过
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)
ps:其实上面的安全性问题,我没看懂
3 通过literal_eval
>>> import ast >>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]}) >>> errors "{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}" >>> type(errors) <class 'str'> >>> errors_dict = ast.literal_eval(errors) >>> errors_dict {'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]} >>> type(errors_dict) <class 'dict'>
扩展:
Python eval()函数python 内置函数
描述
eval()函数用来执行一个字符串表达式,并返回表达式的值
语法
eval(expression[,globals[,locals]])
参数
- expression – 表达式
- globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象
- locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象
返回值
返回表达式计算结果
实例
>>> x = 7 >>> eval('3*x') 21 >>> eval('pow(2,2)') 4 >>> eval('2+2') 4 >>> n=81 >>> eval("n+4") 85
相关文章推荐
- Python 如何将字符串转为字典
- Python 3从入门到精通14-常见的数据类型字符串元组,列表,字典
- Python中将字符串类型转为字典类型(string to dict)
- python 如何将JSON数据原封不动的转为字符串(顺序不能变动)?
- python-14-如何将多个小字符串拼接成一个大的字符串?
- python如何将字符串转换成字典dict类型
- Python探索记(14)——字符串、列表、元组、字典与运算符相关的操作
- python字符串/元组/列表/字典互转
- python中 将字符串和字典的相互转换
- python 2-5 如何快速找到多个字典中的(key) viewkeys(集合)/reduce(lambda a,b:a&b,map(d.keys(),[d1,d2])
- python-13-如何调整字符串中文本的格式?sub函数
- python-15-如何对字符串进行左,右,居中对齐?
- python关于列表转为字典的两个小方法
- python基础深入(元组、字符串、列表、字典)
- 如何在C++中使用类似python的字符串split()函数
- Python中的字符串、列表和字典
- python中如何处理一个字符串中的每一个字符
- python_如何去除字符串中不想要的字符?
- 如何5分钟快速学习Python基础教程(字典详解)
- python 时间字符串转为时间戳