Python根据参数名称修改文本文件
我有一个文本文件(Python根据参数名称修改文本文件,python,replace,command,Python,Replace,Command,我有一个文本文件(“input.param”),用作包的输入文件。我需要修改一个参数的值。需要更改的行如下所示: param1 0.01 model_name run_param1 我需要搜索参数param1并修改0.01的值以获得一系列不同的值,同时模型名称也将根据param1的不同值进行相应更改。例如,如果para1更改为0.03,则model\u name更改为“run\u param1\u p03”。下面是我的一些尝试代码: import numpy as np i
“input.param”
),用作包的输入文件。我需要修改一个参数的值。需要更改的行如下所示:
param1 0.01
model_name run_param1
我需要搜索参数param1
并修改0.01
的值以获得一系列不同的值,同时模型名称
也将根据param1
的不同值进行相应更改。例如,如果para1
更改为0.03,则model\u name
更改为“run\u param1\u p03”。下面是我的一些尝试代码:
import numpy as np
import os
param1_range = np.arange(0.01,0.5,0.01)
with open('input.param', 'r') as file :
filedata = file.read()
for p_value in param1_range:
filedata.replace('param1 0.01', 'param1 ' + str(p_value))
filedata.replace('model_name run_param1', 'model_name run_param1' + '_p0' + str(int(round(p_value*100))))
with open('input.param', 'w') as file:
file.write(filedata)
os.system('./bin/run_app param/input.param')
然而,这是行不通的。我想主要的问题是
replace
命令无法识别空格。但是我不知道如何搜索参数param1
或model_name
并更改它们的值 我正在编辑此答案,以便更准确地回答原始问题,但它没有充分地回答
问题是,replace
命令无法识别空间。为了做到这一点,或regex模块可以提供很大的帮助。您的文档由条目及其值组成,以空格分隔:
param1 0.01
model_name run_param1
在正则表达式中,一般捕获如下所示:
重新导入
someline='param1 0.01'
pattern=re.match(r'^(\S+)\S+(\S+$),someline)
pattern.groups()
#('param1','0.01')
正则表达式的功能如下:
^
捕获行的开头
\S
是任何非空格字符,或任何不在中的字符('\t','\r','\n')
+
表示一个或多个贪婪搜索(将继续,直到模式停止匹配)
\s+
是任何空格字符(与\s
相反,请注意此处的大小写)
()
指示组,或您希望如何对搜索进行分组
如果您愿意的话,这些组可以让您相当容易地将参数解包成变量。要将此应用于您已有的代码,请执行以下操作:
将numpy导入为np
进口稀土
参数1_范围=np.arange(0.01,0.5,0.01)
filedata=[]
以open('input.param','r')作为文件:
#这将把这些行放在一个列表中
#因此,您可以在正则表达式中使用^和$
对于文件中的行:
filedata.append(line.strip())#去掉尾随的换行符
#filedata现在看起来像:
#['param1 0.01','model_name run_param1']
#使用字典保存所有参数可能更容易
#因为您没有更改名称,所以只更改值
groups=[re.match('^(\S+)\S+(\S+)$',x.groups()用于文件数据中的x]
#现在您有了一个元组列表,可以将其馈送到dict()中
my_params=dict(组)
#{'param1':'0.01','model_name':'run_param1'}
#现在只需使用该命令设置参数
对于参数1_范围内的p_值:
我的参数['param1']=str(p_值)
我的参数['model_name']=“run_param1_p0'+str(整数(p_值*100)))
#对于返回到文件中的格式,您可以进行一些快速填充以获得所需的格式
将open('somefile.param','w')作为fh:
content='\n'.join([k.ljust(20)+v.rjust(20)表示k,v在my_params.items()中)
fh.write(内容)
填充是使用str.ljust
和str.rjust
方法完成的,因此您可以得到如下格式:
用于dict(组)中的k,v。items():
intstr=k.ljust(20)+v.rjust(20)
打印(intstr)
参数1 0.01
模型名称运行参数1
尽管可以说,如果您愿意,您可以省略rjust
。您没有将replace
d文本分配到任何位置。Dofiledata=filedata.replace(..)
注意:str.replace
不做inplace
replace你看过regex了吗@谢谢,这是一个很好的收获。“我解决了这个问题,并继续努力。”野牛:谢谢你的建议。我会检查的。谢谢你指出。但是这个程序仍然没有达到我想要的效果。@HuanianZhang我编辑了我的答案,以更好地反映您的问题,希望您能发现它更有帮助。非常感谢。最后,我切换到bashshell脚本,它似乎更容易进行模式匹配和替换。