我正在尝试从一个看起来像数组的文件中读取一行,并使用以下方式将其转换为数组:
eval('points='+lineFromFile)
print(points)
它可以使用,当我尝试一下时:
points=[(1, 0, 0, 0), (4752/8677, 7260/8677, 0, -35/8677)]
print(points)
但这不是:
eval('points=[(1, 0, 0, 0), (4752/8677, 7260/8677, 0, -35/8677)]')
print(points)
为什么要修复它?
我将回答问题的"我如何修复"部分,并建议您使用 ast.literal_eval
:
import ast
points = ast.literal_eval(lineFromFile)
这具有辅助益处,应该是恶意代码执行的安全,并且通常更清洁且易于阅读。不利的一面是,顾名思义,这只会评估python 文字(没有变量)。
另一个选项是使用json.loads
-根据输入字符串,此 May 工作可能会更快。从我可以说的您的示例中,json
无法使用,但我在这里提到。
如果您必须使用eval/exec
(我希望您相信文件的创建者!),那么您最好的选择可能是做:
points = eval(lineFromFile)
而不是尝试将变量名添加到字符串中,然后再添加exec
。您可以做一些事情来尝试使eval
更安全,但是归根结底,如果您这样做,您可能只会给自己一个错误的安全感...