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

我有一个文本文件,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 新手,几乎没有进行过正则表达式!)


PIPIONE
浏览 41回答 5
5回答

侃侃无极

现在,如果您想(硬编码?).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:            breakwith open('sets.py', 'w') as f:    f.write('\n'.join(temp_list))这将创建一个名为sets.py(您可以更改名称)的新 python 文件并将所有值从文本文件存储到 .py 文件。现在,要使用这些值,请首先确保它们sets.py与主 python scipt 位于同一目录中,然后from sets import *现在只需键入其名称即可访问任何这些值,它将被识别。试试看

呼唤远方

我认为这应该可以用字典来实现。像这样的东西: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:            breakreturn variables这会留下字典形式的输出,其中键为:变量名称,值为:变量本身。像这样:变量= {'Lx':'512','Ly':'512','nupower':'8','nu':'0'}我不知道如何实现某种检测它是 int 还是 float 的方法......

守候你守候我

改进了答案之一的脚本,可以检测 int、float 和 strdef 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

牧羊人nacy

对于未来的读者,另一种解决方案是使用代码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 文件。

慕田峪7331174

我的建议是,你可能不应该以这种方式存储它。如果甚至不考虑人类阅读,请使用 pickle 来存储 python 对象。如果它应该是人类可读/可编辑的,我会建议 csv 文件或类似的文件
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python