ast.literal_eval:解析时出现意外的EOF

时间:2018-02-13 21:42:00

标签: python python-2.7 temporary-files

我正在尝试使用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'\xf6\xf6\xe4\xe4', u'??!!\xdf\xdf']

每当我尝试添加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更适合工作的工具?

1 个答案:

答案 0 :(得分:1)

此行非常错误

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的