从文件中读取值,自动创建变量来存储它们
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()
就会执行。
我有一个文本文件,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()
就会执行。