python中ast模块literal_eval()方法与eval()将字符串型的列表,元组,dict转变成原有的类型


方法1:要把'[1,2,2,3]'变为[1,2,2,3]

把str '[1,2,2,3]'左右两边的[ ]替换为空,后str.split变为数组[1,2,3,4]

 

 

方法2:把一个数组字符串转换为数组:

import ast
>>> s = '[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]'


>>> def f1():
... eval(s)


>>> def f2():
... ast.literal_eval(s)


验证通过:
安全性低:
query_result['USD'] = query_result['USD'].apply(lambda x:eval(x))
安全性高:
query_result['USD_lbl'] = query_result['USD_lbl'].apply(lambda x:eval(x))

 

一下转载的文章:https://blog.csdn.net/lmz_lmz/article/details/83863783

Python中,如果要将字符串型的列表,元组,dict转变成原有的类型呢?这个时候你自然会想到eval。EVAL函数在Python的中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。

string <==>列表

string <==>元组

string <==> dict

也就是说,使用的eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,EVAL还可以对字符

串型的输入直接计算。比如,她会将 '1 + 1' 的计算串直接计算出结果。 

从上面来看,EVAL功能可谓非常强大,即可以做字符串与列表,元组,字典之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!!比如说,用户恶意输入下面的字符串

打开(r'D://filename.txt','r')。read()

__import __( 'OS​​')。系统( 'DIR')

__import __('os')。system('rm -rf / etc / *')

那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!所以这里就引出了另外一个安全处理方式ast.literal_eval。可以先看下计算器及Python的官方关于这个解释!

堆栈溢出

Python的官方文档

简单点说AST模块就是帮助的Python应用来处理抽象的语法解析的而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的蟒类型,如果是则进行运算,否则就不进行运算。

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。

报值错误,不合法的字符串!

而只会执行合法的Python的类型,从而大大降低系统的危险性!

所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM