Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python根据参数名称修改文本文件_Python_Replace_Command - Fatal编程技术网

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文本分配到任何位置。Do
filedata=filedata.replace(..)
注意:
str.replace
不做
inplace
replace你看过regex了吗@谢谢,这是一个很好的收获。“我解决了这个问题,并继续努力。”野牛:谢谢你的建议。我会检查的。谢谢你指出。但是这个程序仍然没有达到我想要的效果。@HuanianZhang我编辑了我的答案,以更好地反映您的问题,希望您能发现它更有帮助。非常感谢。最后,我切换到bashshell脚本,它似乎更容易进行模式匹配和替换。