为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2024-01-24 15:51:58
我有一个文本文件,params.txt其格式如下(忽略颜色格式,这是一个纯文本文件,而不是 python 代码):Lx = 512 Ly = 512g = 400================ Dissipation =====================nupower = 8 nu = 0alphapower = -0 alpha = 0================ Timestepping =========================SOMEFLAG = 1SOMEOTHERFLAG = 4dt = 2e-05[...and so on]即变量按其值分隔=,值是整数、浮点数和科学记数法的混合,有时一行上有两个变量/值对,由一个空格分隔,并且有以下形式的标题================ HeadingToBeDiscarded ================在 python 中,如何读取文本文件,并在 python 脚本中自动创建相同的变量并为它们分配与文件中相同的值?文件的格式每次都是相同的,因此可以进行暴力破解,但我确信有一个优雅的 python/regex 解决方案(但我是 python 新手,几乎没有进行过正则表达式!)
查看完整描述

5 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

现在,如果您想(硬编码?).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 *现在只需键入其名称即可访问任何这些值,它将被识别。试试看


查看完整回答
反对 回复 2024-01-24
?
呼唤远方

TA贡献1856条经验 获得超11个赞

我认为这应该可以用字典来实现。


像这样的东西:


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 的方法......


查看完整回答
反对 回复 2024-01-24
?
守候你守候我

TA贡献1802条经验 获得超10个赞

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


查看完整回答
反对 回复 2024-01-24
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


查看完整回答
反对 回复 2024-01-24
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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

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

如果它应该是人类可读/可编辑的,我会建议 csv 文件或类似的文件


查看完整回答
反对 回复 2024-01-24
  • 5 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信