从文件中读取值,自动创建变量来存储它们

Read values from a file, automatically creating variables to store them

我有一个文本文件,params.txt 说,它具有以下形式(忽略颜色格式,这是一个纯文本文件而不是 python 代码):

Lx = 512 Ly = 512
g = 400
================ Dissipation =====================
nupower = 8 nu = 0
alphapower = -0 alpha = 0
================ Timestepping =========================
SOMEFLAG = 1
SOMEOTHERFLAG = 4
dt = 2e-05
[...and so on]

即变量由它们的值分隔 =,值是整数、浮点数和科学记数法的混合,有时一行上有两个 variable/value 对,由一个 space 分隔, 并且有

形式的标题

================ HeadingToBeDiscarded ================

在 python 中,如何读取文本文件,并在我的 python 脚本中自动创建相同的变量并为其分配与文件中相同的值?

文件的格式每次都是相同的,所以暴力破解是可能的,但我确信有一个优雅的 python/regex 解决方案(但我是 python 的新手,几乎没有曾经正则表达式!)

我的建议是您可能不应该以这种方式存储它。

如果甚至不考虑人类阅读,请使用 pickle 来存储 python 个对象。

如果它应该是 readable/editable 给人类的,我会建议 csv 文件或类似的东西

我想这应该可以用字典实现。

像这样:

def getVariables():
with open("filename.txt",'r') as file:
    variables = {}
    while True:
        line = file.readline()
        line = line.strip()
        value = line.split(' ')
        for i, word in enumerate(value):
            if word == '=':
                variables[str(value[i-1])] = value[i+1]
        if not line:
            break
return variables

这会以字典形式留下一个输出,其中键为:变量名称,值为:变量本身。像这样:

变量={'Lx':'512','Ly':'512','nupower':'8','nu':'0'}

我不知道如何实现某种检测它是 int 还是 float 的方法...

改进了可以检测 int、float 和 str 的答案之一的脚本

def getVariables():
    with open("params.txt") as file:
        variables = {}
        while True:
            line = file.readline()
            line = line.strip()
            value = line.split(' ')
            for i, word in enumerate(value):
                if word == '=':
                    try:
                        variables[str(value[i-1])] = int(value[i+1])
                    except ValueError:
                        try:
                            variables[str(value[i-1])] = float(value[i+1])
                        except ValueError:
                            variables[str(value[i-1])] = (value[i+1])
            if not line:
                break
    return variables

现在如果你想(硬编码?).txt 文件中的数据到 .py 文件你应该使用这样的东西:

temp_list = []
with open("params.txt") as file:
    while True:
        line = file.readline()
        line = line.strip()
        value = line.split(' ')
        for i, word in enumerate(value):
            if word == '=':
                var = f'{value[i-1]} = {value[i+1]}'
                temp_list.append(var)
        if not line:
            break

with open('sets.py', 'w') as f:
    f.write('\n'.join(temp_list))

这将创建一个名为 sets.py 的新 python 文件(您可以更改名称)并将所有值从文本文件存储到 .py 文件。现在要使用这些值,首先确保 sets.py 与您的主要 python scipt 在同一目录中,然后执行 from sets import * 现在您只需键入即可访问这些值中的任何一个它的名字,它将被识别。试试看

对于未来的读者,另一种解决方案是使用 exec() 到 运行 来自 params.txt 的适当 chopped-up 字符串作为代码,为变量分配给定的值:

with open('params.txt', 'r') as infile:
for line in infile:
    splitline = line.strip().split(' ')
    for i, word in enumerate(splitline):
        if word == '=':
            # DANGER! Don't use this unless you completely trust the content of params.txt!
            exec(splitline[i-1] + splitline[i] + splitline[i+1])

这避免了必须按照 Matiiss 的解决方案解析文件、创建字典、打印 .py 文件然后读入 .py 文件。

询问这是否真的是个好主意。 编辑:这不是一个好主意,因为 exec() 存在安全风险,但在仅在本地 运行 且不面向外界的代码中可能没问题。特别是如果没有人可以在 params.txt 中编写恶意代码,然后 exec() 就会执行。