1.json.loads()
字典样式的或者列表样式的字符串可以直接使用json.loads转换
import json
# 字符串转字典
a = '{"key":"value","key2":"value2"}'
b = json.loads(a)
print(b)
# 字符串转列表
a = '["key","value","key2","value2"]'
b = json.loads(a)
print(b)
2.eval()函数
eval() 函数也可以用来转换字符串,而且字典,列表,元组样式的都可以转
# 转成字典
a = '{"key":"value","key2":"value2"}'
b = eval(a)
print(type(b))
print(b)
<class 'dict'>
{'key': 'value', 'key2': 'value2'}
# 转成列表
a = '["key","value","key2","value2"]'
b = eval(a)
print(type(b))
print(b)
<class 'list'>
['key', 'value', 'key2', 'value2']
# 转成元组
a = '("key","value","key2","value2")'
b = eval(a)
print(type(b))
print(b)
<class 'tuple'>
('key', 'value', 'key2', 'value2')
但是eval() 函数的功能主要是用来执行一个字符串表达式,并返回表达式的值。
a = '1+1+1'
b = eval(a)
print(type(b))
print(b)
<class 'int'>
3
# eval()函数中的字符串会执行
而且eval()函数有一定的危险性:
a = "__import__('os').system('XXX')"
# 如果输入恶意字符串就可以利用执行系统命令,操作文件、删除文件等等操作
3.ast.literal_eval()
因为eval()函数的危险性,于是引出literal_eval()函数
literal_eval()会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
import ast
a = ast.literal_eval('1 + 1')
print(a)
2
# 如果使用ast.literal_eval()执行危险操作都会拒绝执行并报错,大大降低系统的危险性
a = "__import__('os').system('XXX')"
ast.literal_eval(a)
4.都不能满足要求
如果字符串是:
a = '[(\'key\',\'__import__(\'os\').system(\'ls\')\'),(\'key2\',\'open(xxx).read()\')]'
虽然ast.literal_eval()是安全的,不会执行里面的危险字符串,但是会报错而不会返回结果
而又需要把字符串转换,所以不能满足要求,只能自己解析
b_list = []
a_str = '[(\'key\',\'__import__(\'os\').system(\'ls\')\'),(\'key2\',\'open(xxx).read()\')]'
str_h = a_str[1:-1]
temp_list = str_h.split('),(')
for p in temp_list:
pp = p.replace('(', '').replace(')', '').replace('\'', '')
kv_array = pp.split(',')
b_list.append(tuple(kv_array))
print(type(b_list))
print(b_list)