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

ast.literal_eval: Unexpected EOF while parsing

我正在尝试使用 ast.literal_eval 将数组作为字符串存储在 tempfile.TemporaryFile 中解析回数组。我的(简化的)代码如下所示:

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 更适合这项工作的工具吗?

这一行非常错误:

for line in temp_file.read():

temp_file.read() returns 完整文件 内容。现在 line 是一个字符,这解释了为什么 literal_eval 仅在第一个 [ 上打印语法错误。

您想迭代这些行,只需:

for line in temp_file:
    line = literal_eval(line)

I am aware, that I have to be careful with ast.literal_eval. Is there a more apropriate tool for the job than ast.literal_eval?

您将其与 eval() 混为一谈,这是不安全的,因为它会评估任何内容,包括删除整个硬盘驱动器的语句。 ast.literal_eval 仅评估 文字 ,因此它非常安全,尽管有限制(您不能传递过于复杂的表达式,如乘法等...),但在您的情况下,您只需反序列化一个转储,所以它非常适合。

(请注意,json.loads 在这里不起作用,因为单引号和 python 特定的 u 前缀)