博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python将字符串转为字典最佳实践
阅读量:5906 次
发布时间:2019-06-19

本文共 2889 字,大约阅读时间需要 9 分钟。

在工作中我们经常会遇到数据类型之间的互转的问题,而通常我们请求一些API借口返回的结果就是字符串,但是格式是Json的,在Python中转为字典是最易处理的,所以这里记录一下在Python下把字符串转为字典的三种方法。

方法一: 通过内置函数eval

Source Code:

#!/usr/bin/env python3#Author: nock.chenstr_info = "{'name': 'nock', 'age': 14}"dict_info = eval(str_info)print("string info type is -->: %s" % (type(str_info)))print("dict info type is -->: %s" % (type(dict_info)))复制代码

Result:

string info type is -->: 
dict info type is -->:
复制代码

不过使用eval有一个安全性问题,示例如下:

Source Code:

#!/usr/bin/env python3#Author: nock.chenstr_info = input('input str info: ')dict_info = eval(str_info)print("dict_info is >%s< " % dict_info)复制代码

Result:

input str info: __import__('os').system('ls')collector_data.pytest.pyDownloaddict_info is >0< 复制代码

如上所示当我们输入__import__('os').system('ls')的时候会打印出脚本所存目录下的文件,如果传入一个rm -rf *之类的命令,那则会把所有改目录下的东西删除掉;当然我们这么去用的场景会非常好少,也不可能有人会这么传值,不过这里说明一下。

方法二: 通过json模块处理

Source Code:

#!/usr/bin/env python3#Author: nock.chenimport jsonstr_info = '{"name": "nock", "age": 18}'dict_info = json.loads(str_info)print("string info type is -->: %s" % (type(str_info)))print("dict info type is -->: %s" % (type(dict_info)))复制代码

Result:

string info type is -->: 
dict info type is -->:
复制代码

使用json模块进行转换也存在一个问题,由于json语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号, 上有一段描述是:

报错示例如下:

#!/usr/bin/env python3#Author: nock.chenimport jsonstr_info = "{'name': 'nock', 'age': 18}"dict_info = json.loads(str_info)复制代码

报错结果如下:

Traceback (most recent call last):  File "test.py", line 7, in 
dict_info = json.loads(str_info) File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads return _default_decoder.decode(s) File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/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)复制代码

方法三: 通过ast模块处理

Source Code:

#!/usr/bin/env python3#Author: nock.chenimport aststr_info = '{"name": "nock", "age": 18}'dict_info = ast.literal_eval(str_info)print("string info type is -->: %s" % (type(str_info)))print("dict info type is -->: %s" % (type(dict_info)))s_info = "{'name': 'nock', 'age': 18}"d_info = ast.literal_eval(s_info)print("s info type is -->: %s" % (type(s_info)))print("d info type is -->: %s" % (type(d_info)))复制代码

Result:

string info type is -->: 
dict info type is -->:
s info type is -->:
d info type is -->:
复制代码

使用ast.literal_eval进行转换既不存在使用json 模块进行转换的问题,也不存在使用eval模块进行转换的安全性问题,因此推荐大家使用ast.literal_eval的方法。

转载地址:http://yrcpx.baihongyu.com/

你可能感兴趣的文章
DW 正则
查看>>
抓屏原理
查看>>
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
查看>>
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
上传图片预览
查看>>
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
Docker的系统资源限制及验证
查看>>
c++ ios_base register_callback方法使用
查看>>
Java中为什么需要Object类,Object类为什么是所有类的父类
查看>>
angularjs-paste-upload
查看>>