GVKun编程网logo

python ast.literal_eval和datetime

21

关于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

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中的变量吗?

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.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(转)

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中不存在

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中不存在等更多相关知识的信息可以在本站进行查询。

本文标签: