python字符串变为字典_Python将字符串转为字典

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

方法一: 通过内置函数eval

Source Code: #!/usr/bin/env python3

#Author: nock.chen

str_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.chen

str_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.py

test.py

Download

dict_info is >0<

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

方法二: 通过json模块处理

Source Code: #!/usr/bin/env python3

#Author: nock.chen

import json

str_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.chen

import json

str_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.chen

import ast

str_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的方法。

本文由 空心菜 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为: Apr 17, 2018 at 01:08 pm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值