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

问题描述

我有一个文本文件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]

即变量由它们的值用=隔开,这些值是整数,浮点数和科学计数法的混合,有时在一行上有两个变量/值对,它们之间用一个空格隔开,并且标题为表格

================ headingToBediscarded ================

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

每次文件的格式都相同,因此可能会出现强行强制使用的情况,但是我敢肯定有一个优雅的python / regex解决方案(但我是python的新手,几乎没有进行过正则表达式!)

解决方法

现在,如果您要将.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 *,现在您只需输入名称和名称即可访问其中的任何一个将被认可。试试吧

,

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

如果甚至不考虑让人类阅读,则可以使用泡菜来存储python对象。

如果应该对人类可读/可编辑,我建议使用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
,

对于将来的读者,另一种解决方案是使用exec()作为代码来运行params.txt中切碎的字符串,以给变量赋值:

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文件的情况。

I have posted another question here询问这实际上是否是一个好主意。 编辑:这不是一个好主意,因为exec()有安全隐患,但是在只在本地运行并且不面向外部的代码中可能还可以。特别是,如果没有人能够在params.txt中编写exec()然后执行的恶意代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...