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
前缀)
我正在尝试使用 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
前缀)