我正在尝试使用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
更适合工作的工具?
答案 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的