关于pythonast.literal_eval和datetime的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ast.literal_eval用于python中的变量吗?、ast.li
关于python ast.literal_eval和datetime的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ast.literal_eval用于python中的变量吗?、ast.literal_eval转换json数据时:ValueError: malformed string、ast.literal_eval(转)、datetime.datetime.strptime在Python 2.4.1中不存在等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- python ast.literal_eval和datetime
- ast.literal_eval用于python中的变量吗?
- ast.literal_eval转换json数据时:ValueError: malformed string
- ast.literal_eval(转)
- datetime.datetime.strptime在Python 2.4.1中不存在
python ast.literal_eval和datetime
我有一个字符串"{''datetime'': datetime.datetime(2010, 11, 21, 0, 56,58)}"
,我想将其转换为它代表的对象。使用ast.literal_eval()
给
ValueError: malformed string;
因为它不允许构造对象(即datetime
调用)。无论如何,要么可以ast
正确地处理此问题,要么可以确保eval
防止代码注入?
答案1
小编典典跟随伊格纳西奥·巴斯克斯(Ignacio Vazquez-brams)的想法:
import astimport datetimedef parse_datetime_dict(astr,debug=False): try: tree=ast.parse(astr) except SyntaxError: raise ValueError(astr) for node in ast.walk(tree): if isinstance(node,(ast.Module,ast.Expr,ast.Dict,ast.Str, ast.Attribute,ast.Num,ast.Name,ast.Load, ast.Tuple)): continue if (isinstance(node,ast.Call) and isinstance(node.func, ast.Attribute) and node.func.attr == ''datetime''): continue if debug: attrs=[attr for attr in dir(node) if not attr.startswith(''__'')] print(node) for attrname in attrs: print('' {k} ==> {v}''.format(k=attrname,v=getattr(node,attrname))) raise ValueError(astr) return eval(astr)good_strings=["{''the_datetime'': datetime.datetime(2010, 11, 21, 0, 56, 58)}"]bad_strings=["__import__(''os''); os.unlink", "import os; os.unlink", "import(os)", # SyntaxError ]for astr in good_strings: result=parse_datetime_dict(astr) print(''{s} ... [PASSED]''.format(s=astr))for astr in bad_strings: try: result=parse_datetime_dict(astr) except ValueError: print(''{s} ... [REJECTED]''.format(s=astr)) else: sys.exit(''ERROR: failed to catch {s!r}''.format(s=astr))
产量
{''the_datetime'': datetime.datetime(2010, 11, 21, 0, 56, 58)} ... [PASSED]__import__(''os''); os.unlink ... [REJECTED]import os; os.unlink ... [REJECTED]import(os) ... [REJECTED]
ast.literal_eval用于python中的变量吗?
假设我有一个文件example.py
:import example
VVV = 2DictionaryNameB = { ''a'' : VVV, ''bb'' : ''SomethingB'', ''c'' : False, ''ccc'' : None, ''dddd'' : ''true'', ''eeeee'' : 0.123456, ''f'' : 2, ''h'' : [1,2,3]}
我写了一个使用的函数ast.literal_eval()
:
def getDicFromFile(self, dic_name): with open( ''example.py'' ) as f: file_data = f.read() match = re.findall(''%s[^{]+\{[^\}]+\}'' % dic_name, file_data, re.MULTILINE)[0] # print(match) dicObject = ast.literal_eval(match[len(dic_name)+3:]) return dicObject
我收到错误引发ValueError(’formaled string’); ValueError:格式错误的字符串
我知道ast.literal_eval()
无法解码变量VVV
,还有另一种方法吗?
答案1
小编典典您可以使用asteval
,在ast
分析树上构建的库来执行有限的语句。它将立即处理您的示例:
from asteval import Interpreteraeval = Interpreter()aeval(file_data)dicObject = aeval.symtable[''DictionaryNameB'']
或者,您可以仅导入文件:
from importlib import import_modulemodule = import_module(''example'')dicObject = module.DictionaryNameB
asteval
允许使用多种Python构造。您可以将Python抽象语法与处理aeval.node_handlers
映射寄存器的处理程序进行比较,只需删除不需要的任何内容即可。例如,您可以删除函数定义以及调用,循环,二进制操作(binop
)和异常处理。
ast.literal_eval转换json数据时:ValueError: malformed string
背景:使用ast将json数据转换字典时报错
import ast filter_psglist='{"a": null}' ast.literal_eval(filter_psglist)
经过查询发现,ast.literal_eval不支持值为null,
ast.literal_eval(转)
eval函数在Python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。那么eval和ast.literal_val()的区别是什么呢?本文将大家介绍关于Python中函数eval和ast.literal_eval区别的相关资料,需要的朋友可以参考下。
前言
众所周知在Python中,如果要将字符串型的list,tuple,dict转变成原有的类型呢? 这个时候你自然会想到eval. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.下面来看看示例代码:
string <==> list
string <==> tuple
string <==> dict
也就是说,使用eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval还可以对字符
串型的输入直接计算。比如,她会将''1+1''的计算串直接计算出结果。
从上面来看,eval功能可谓非常强大,即可以做string与list,tuple,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串
open(r''D://filename.txt'', ''r'').read()
__import__(''os'').system(''dir'')
__import__(''os'').system(''rm -rf /etc/*'')
那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!
所以这里就引出了另外一个安全处理方式ast.literal_eval.可以先看下stackoverflow及Python官方关于这个解释!
stackoverflow
Python官方文档
简单点说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()
函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval()
,都会拒绝执行。
报值错误,不合法的字符串!
而只会执行合法的Python类型,从而大大降低系统的危险性!
所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()
函数!
总结
以上就是Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)的详细内容,更多请关注php中文网其它相关文章!
datetime.datetime.strptime在Python 2.4.1中不存在
在某些情况下,我们的团队需要使用Python 2.4.1。在Python
2.4.1strptime
中的datetime.datetime
模块中不存在:
Python 2.4.1 (#65,Mar 30 2005,09:13:57) [MSC v.1310 32 bit (Intel)]
Type "help","copyright","credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.strptime
Traceback (most recent call last):
File "<string>",line 1,in <fragment>
AttributeError: type object 'datetime.datetime' has no attribute 'strptime'
与2.6相反:
Python 2.6.6 (r266:84297,Aug 24 2010,18:46:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help","credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.strptime
<built-in method strptime of type object at 0x1E1EF898>
键入时,我在2.4.1的时间模块中找到了它:
Python 2.4.1 (#65,09:16:17) [MSC v.1310 32 bit (Intel)]
Type "help","credits" or "license" for more information.
>>> import time
>>> time.strptime
<built-in function strptime>
我认为它strptime
在某个时候动了吗?检查这种事情的最好方法是什么。我尝试查看python的发行历史,但找不到任何东西。
今天关于python ast.literal_eval和datetime的介绍到此结束,谢谢您的阅读,有关ast.literal_eval用于python中的变量吗?、ast.literal_eval转换json数据时:ValueError: malformed string、ast.literal_eval(转)、datetime.datetime.strptime在Python 2.4.1中不存在等更多相关知识的信息可以在本站进行查询。
本文标签: