问题描述
我有一个文本文件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()
然后执行的恶意代码。