AST.LITERAL_EVAL:解析时出乎意料的EOF



我正在尝试解析一个数组,该数组以tempfile.TemporaryFile中的字符串存储,使用ast.literal_eval回到数组中。我的(简化的(代码看起来像这样:

from ast import literal_eval
from tempfile import TemporaryFile
# a TemporaryFile temp_file gets created and filled with some arrays.
temp_file.seek(0)
for line in temp_file.read():
    line = literal_eval(line)
    for element in line:
        print element.decode('utf-8')
temp_file.close()

temp_file的内容看起来像这样(如果删除了literal_eval调用(:

['Hello', 'World', '123']
['Unicode', u'xf6xf6xe4xe4', u'??!!xdfxdf']

每当我尝试添加literal_eval调用时,Python会抛出以下SyntaxError

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1544, in __call__
    return self.func(*args)
  File "test.py", line 81, in <lambda>
    b = Button(self.frame_below_right,text="Yealink Code generieren",command=lambda *args:self.scanGrid(self.frame_table))
  File "test.py", line 137, in scanGrid
    line = literal_eval(line)
  File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    [
    ^
SyntaxError: unexpected EOF while parsing

我知道,我必须小心ast.literal_eval。尽管如此,是否有比ast.literal_eval更合适的工具?

此行是非常错误的

for line in temp_file.read():

temp_file.read()返回完整的文件目录。现在line是一个角色,它解释了为什么literal_eval仅在第一个[上打印语法错误。

您想在线上迭代,简单地:

for line in temp_file:
    line = literal_eval(line)

我知道,我必须小心ast.literal_eval。是否有比AST.LITERAL_EVAL更适合工作的工具?

您将其与eval()混合在一起,因为它可以评估任何内容,包括删除整个硬盘驱动器的语句。 ast.literal_eval仅评估文字,所以它是完全安全的,尽管有限(您不能传递太复杂的表达式(例如乘法等(,等等(适合。

(请注意,json.loads由于单个引号而在这里无法使用,而u前缀是Python特定的(

最新更新