在Python中将文件解析为带有评估/EXEC的数组



我正在尝试从一个看起来像数组的文件中读取一行,并使用以下方式将其转换为数组:

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更安全,但是归根结底,如果您这样做,您可能只会给自己一个错误的安全感...

最新更新