在工作中遇到一个小问题,需要将一个 python 的字符串转为字典,比如字符串:

user_info = '{"name" : "john", "gender" : "male", "age": 28}'

我们想把它转为下面的字典:

user_dict = {"name" : "john", "gender" : "male", "age": 28}

有以下几种方法:

1、通过 json 来转换

>>> import json
>>> user_info= '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = json.loads(user_info)
>>> user_dict
{u'gender': u'male', u'age': 28, u'name': u'john'}

但是使用 json 进行转换存在一个潜在的问题。

由于 json 语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号 (官网上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此下面的转换是错误的:

>>> import json
>>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
# 由于字符串使用单引号,会导致运行出错
>>> user_dict = json.loads(user_info)
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loadsreturn _default_decoder.decode(s)File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decodeobj, end = self.raw_decode(s, idx=_w(s, 0).end())File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decodeobj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)

2、通过 eval

>>> usr_info = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
>>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}

通过 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)

3、通过 literal_eval(好处是字符串的bool类型可能是True,Python不认识,但是此方法可以避免这个问题)

>>> import ast
>>> user = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}

使用 ast.literal_eval 进行转换既不存在使用 json 进行转换的问题,也不存在使用 eval 进行转换的 安全性问题,因此推荐使用 ast.literal_eval

Python 字符串转字典(多种方法)相关推荐

  1. python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解

    一文秒懂!Python字符串格式化之format方法详解 一文秒懂!Python字符串格式化之format方法详解 format是字符串内嵌的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符 ...

  2. python字符串lower,upper,capwordds方法,translate(使用替换后),maketrans(创建表)的使用(不知道怎么回事这个变乱了?后期再整理)

    python字符串lower,upper,capwordds方法的使用 print("Skyline".lower()) # 转为小写skyline print("Sky ...

  3. Python字符串join()方法

    Python string join() method creates a string from an iterable. It joins all the iterable elements wi ...

  4. python学习笔记:去掉python字符串中空格的方法总结

    去掉python字符串中空格的方法总结 在python的字符串处理过程中,有一个很常见的操作的是去掉字符串中的空格,python提供了以下四个函数来实现该操作: (1) lstrip()函数 (2) ...

  5. Python字符串、字典的使用方法介绍

    #第三章:使用字符串 1:基本字符串操作:所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用.但记住:字符串是不可变的 2:字符串格式化:精简版 使用字符串 ...

  6. python字符串split_「干货」Python字符串中的split方法

    前面的文章我们有简单的介绍过什么是字符串.Python字符串的输入方式.Python字符串的拼接方法等今天我们主要分享一下Python字符串中split方法! Python字符串中的方法有很多种,其中 ...

  7. python字符串/列表/字典互相转换

    字符串与列表 字符串转列表 1.整体转换 str1 = 'hello world' print(str1.split('这里传任何字符串中没有的分割单位都可以,但是不能为空')) # 输出:['hel ...

  8. 【Python入门】Python字符串的45个方法详解

    Python中字符串对象提供了很多方法来操作字符串,功能相当丰富.必须进行全面的了解与学习,后面的代码处理才能更得心应手,编程水平走向新台阶的坚实基础.目前一共有45个方法,给大家分类整理,可以收藏查 ...

  9. oracle split函数用法_「干货」Python字符串中的split方法

    前面的文章我们有简单的介绍过什么是字符串.Python字符串的输入方式.Python字符串的拼接方法等今天我们主要分享一下Python字符串中split方法! Python字符串中的方法有很多种,其中 ...

最新文章

  1. ARM32页表-虚拟地址到物理地址的转换
  2. 一文梳理缺陷检测方法
  3. 数据挖掘分析的必要性
  4. TCP层,flags字段标识位含义说明
  5. express-14 发送邮件
  6. 【数值分析】迭代法解方程:牛顿迭代法、Jacobi迭代法
  7. hao123电脑版主页_hao123浏览器 原生网民的记忆 一代站长的传奇
  8. 二、bootstrap4基础(flex布局)
  9. 高德联手饿了么:外卖小哥跑出偏远地区活地图
  10. ITK+VTK+VS环境搭建.Q:vs编译出问题参见VTK(一)哈。
  11. 防止mdf文件被非法附加后修改的一个简单实现方案
  12. Ubuntu桌面环境 安装与切换
  13. 离散数学-2 命题逻辑等值演算
  14. 十年,一个黑客的轮回经历
  15. scrapy学习笔记(三)-关于动态加载网页的爬取(序)
  16. 国防科技大学计算机学院 网络与信息安全研究所所长,为网络铸盾,国防科大战队再获佳绩!...
  17. 大数据工具Maxwell的使用
  18. echarts地图钓鱼岛赤尾屿和南海诸岛内部岛屿问题
  19. Discuz中常用的编辑器代码
  20. 凌凯短信Webservice接口报错解决办法

热门文章

  1. MIT免费生物信息课程 (代码、文档、数据) - 适合系统学习
  2. 机器学习第20篇 - 基于Boruta选择的特征变量构建随机森林
  3. 用了都说好的SCI在线绘图工具来了~~~~~~~
  4. 8位16进制频率计设计实验--VHDL
  5. PAT学习资料汇总(PAT甲级、PAT顶级、PAT考试经验)
  6. 洛谷 深基 第1部分 语言入门 第2章 顺序结构程序设计
  7. 1.9 编程基础之二分查找 12 最长平台 python
  8. 第51课 拍手游戏--2021.09.19
  9. php通过使用curl获取http或者https的响应信息的方式
  10. python path模块_python pathlib模块详解