执行文件而不是解析它

时间:2015-03-27 20:29:13

标签: python

我使用Python来解析一些文件,结果发现其中一个文件本身就是一个Python脚本。我需要在列表中找到元素,并且列表是专门定义的。我正在解析的文件包含如下行:

THESE_VALUES = ["Value1", "vAlue2", "VaLUE4"]

我可以使用我的 Python脚本来解析此行中的"并获取每个单独的条目,但是这样做可能同样容易它在我的脚本中执行以创建我自己的THESE_VALUES数组。这可能吗?

如果这是不可能的,或者是不明智的,那么获取这些字符串的最简单/最pythonic的方法是什么?

注意:此行完全受信任,我不需要担心执行错误/不正确的命令。

4 个答案:

答案 0 :(得分:1)

您可以使用eval,因为您完全信任您的输入(您已被警告过):

>>> s = 'THESE_VALUES = ["Value1", "vAlue2", "VaLUE4"]'
>>> eval(s.split('=', 1)[1])
['Value1', 'vAlue2', 'VaLUE4']

使用上面的代码,我们在第一个=进行拆分,然后我们评估等号后面的表达式。

答案 1 :(得分:0)

如果我正确理解了这个问题,一旦你解析了字符串,就可以使用exec来评估字符串作为python命令:

exec('THESE_VALUES = ["Value1", "vAlue2", "VaLUE4"]')

答案 2 :(得分:0)

你可以这样做:

def getValues(str_values):
    l = locals()
    exec(str_values)
    return l['THESE_VALUES']

getValues('THESE_VALUES = ["Value1", "vAlue2", "VaLUE4"]')

答案 3 :(得分:0)

如果要解析以"THESE_VALUES = "开头的行,可以在拆分后使用ast.literal_eval

from ast import literal_eval
with open("in.py") as f:
    for line in f:
        if line.startswith("THESE_VALUES"):
              print(literal_eval(line.split("=",1)[1].strip()))
              break
['Value1', 'vAlue2', 'VaLUE4']