如何从txt文件导入行并将其设置为变量值python?

时间:2018-08-09 06:01:54

标签: python python-3.7

我有一个test.txt文件,现在有2行

not False == True
not True == True

我正在尝试将其导入到函数中,以便它将显示带有输入的文本,然后实际执行布尔计算 然后针对每一行再次执行此操作。它适用于第6行的输入,但第7行不起作用,我知道为什么,我只是不知道如何去做我想做的事情...

def calc (read):
    line = read.readline()

    if line:
        lines = line.strip()
        input(f"Does {lines}?>")
        print(f"{lines}")
        return calc(boolfile)

boolfile = open("test.txt")
calc(boolfile)

2 个答案:

答案 0 :(得分:1)

f字符串只能计算在f字符串内部的字面意义上的表达式。

如果您希望像对待源代码一样评估包含表达式表示形式的字符串,则需要使用eval

const HEADING_OPTION = Object.freeze({ H1: 1, H2: 2, H3: 3, H4: 4, H5: 5, H6: 6, }); type HeadingOption = $Values<typeof HEADING_OPTION>; let h1: HeadingOption = HEADING_OPTION.H1; // OK h1 = 1; // OK // $Expect error: Cannot assign `999` to `h1` because number is incompatible with enum h1 = 999; 几乎总是一个坏主意有很多原因(tl; dr:任何可以更改您传递给eval的输入的人都可以让您运行他们想要的任何代码)。但是,如果这确实是您要执行的操作,那就是执行此操作的方法:

eval

如果您想做更安全的事情,唯一可以做的就是将代码解析和解释为比“任何Python表达式”更安全的事情。这并不像听起来那样难(特别是因为,如果您的语言是Python的确切子集,您可以只使用ast模块进行解析,而只需要编写解释器部分),但是不完全是单线的。

答案 1 :(得分:0)

似乎您正在寻找eval。 试试这个:

def calc (read):
    line = read.readline()

    if line:
        lines = line.strip()
        input(f"Does {lines}?>")
        print(eval(lines))
        return calc(boolfile)

boolfile = open("test.txt")

calc(boolfile)

输出:

Does not False == True?>
True
Does not True == True?>
False