首页 > 编程语言 >Python 如何将字符串转为字典

Python 如何将字符串转为字典

时间:2022-09-05 17:36:07浏览次数:102  
标签:info name Python gender 28 dict user 字符串 字典

实习工作中需要将每行读取的字符串例如'{"A":"sad", "B":"123"}'这种形式中的123取出来,查找到了这篇文章,对我很有帮助。转载一下防止遗失。

将一个 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 loads
    return _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 decode
    obj, 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_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)
'''

 

2、通过 eval

user_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

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

标签:info,name,Python,gender,28,dict,user,字符串,字典
From: https://www.cnblogs.com/xinmomoyan/p/16658934.html

相关文章

  • Python22-逻辑运算符
    逻辑运算符逻辑运算符经常和关系运算符一起使用,通过逻辑运算符来连接多个关系运算符参与的数据:主要就是bool类型的数据比较之后的结果是:bool类型#与and一假俱......
  • 344 反转字符串
    题目344反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用......
  • Python引入matplotlib
    Matplotlib是一个 Python 的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图......
  • 1048. 最长字符串链
    给出一个单词数组 words ,其中每个单词都由小写英文字母组成。如果我们可以 不改变其他字符的顺序 ,在wordA 的任何地方添加恰好一个字母使其变成 wordB ,那么我们......
  • Python21-关系运算符
    关系运算符也称为比较运算符参与的数据:主要就是数值a=100b=300c=200d=100print(a>b)#Falseprint(c<b)#Trueprint(a==d)#Trueprint(......
  • 字符串格式化
    一、使用%:在%的左侧放置一个字符串,右侧放置希望被格式化的值,可以使用一个值,也可以使用多个值,多个值用放在一个元组或字典里。注意:如果使用列表或其它序列代替元组(或字典),那......
  • 听说 iPhone14 在 中国时间 9月8日发布, 让我们用python采集看看网友怎么说
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~今天我们来采集一下评论数据! WB态数据抓包+所有的数据提取方式+词云图可视化开发环境:python3.8......
  • Python读取txt文件
    F.read()和F.readlines():1#Python读取txt2defFread():3print('-----readby.read()-----')4withopen('test.txt',encoding='utf-8')asfile:5......
  • Python源码解析-list对象的底层实现(PyListObject)
    目录简介PyListObject内存管理创建list缓存池管理本文基于Python3.10.4。简介数组是程序中一个十分重要的概念,我们将符合某一特性的多个元素集合在一块形成一个数组,同时......
  • python中的map函数
    https://blog.csdn.net/quanlingtu1272/article/details/95482253?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166235753216782414917034%2522%252C%2522sc......