【发布时间】:2018-03-25 13:30:36
【问题描述】:
我有一个包含很多软件参数的文件,看起来像这样:
CMaterial::m_HurkxPrefactor=6.14
CMaterial::m_HurkxFgamma=368800
CRegion::m_FrontDiff1:
In CDiffusion: ver_num=1
CDiffusion::m_Enable=0
CDiffusion::m_Type=0
CDiffusion::m_Profile=2
CDiffusion::m_Npeak=1e+020
CDiffusion::m_Depth=1.5e-005
CDiffusion::m_Xpeak=0
CRegion::m_FrontDiff2:
In CDiffusion: ver_num=1
CDiffusion::m_Enable=0
CDiffusion::m_Type=1
CDiffusion::m_Profile=0
CDiffusion::m_Npeak=9e+016
CDiffusion::m_Depth=0.018
CDiffusion::m_Xpeak=0
(有更多的行)
有几个区域,第一个“CDiffusion::m_Enable”控制第一个区域的属性,第二个幻影用于设置第二个区域。
我希望获取此文本文件并替换为我的值。 目前我知道如何使用此代码更改几个参数,但是它对文件中参数的重复管理很差:
params = {'CDiffusion::m_Type': 3,
'CDiffusion::m_Depth' : 0.018
}
编辑:错过了这部分代码
lab, val = [], []
for k, v in params.items():
lab.append(k)
value.append(v)
s = f.read()
for num, val in enumerate(lab):
s = re.sub('{0}=(.?)*'.format(val), '{1}={0}'.format(value[num], val), s)
但现在我想例如将“CDiffusion::m_Type”更改为 3,将第二个“CDiffusion::m_Type”更改为 4。
使用此参数列表并根据最后的幻影进行更改。
params = {'CDiffusion::m_Type': 3,
'CDiffusion::m_Type': 4,
}
任何帮助将不胜感激,在此先感谢!
编辑2: @JoeIddon 解决方案正在运行,但我想进一步推动它:
lines = open('Test4.txt').read().strip().split('\n')
params = {
'CDiffusion::m_Type': ['3', 'False' ,'4'],
'CDiffusion::m_Depth': ['5', '6', '5']
}
with open('Test4.txt', 'w') as fh:
for l in lines:
try:
k, v = l.split('=')
if params[k] != 'False':
nl = k + '=' + params[k].pop(0)
else:
nl = l
params[k].pop(0)
except (KeyError, IndexError, ValueError):
nl = l
fh.write(nl + '\n')
print(nl)
fh.closed
如果参数中有某个值,我不想更改行,在本例中为“假”。不过好像不行
【问题讨论】:
-
最后一个字典无效,因为同一个键不能指向多个值,前者只会被覆盖。另外,在您的代码示例中,
value在第二个字符串格式中来自哪里? -
是否所有这些不同的参数都需要按照这个特定的顺序编写,还是没有关系?
-
顺序很重要,第一个幻影,=>第一个区域的参数,第二个幻影=>第二个区域的参数
-
@th0mash 所以你想用 3 替换第一次出现的 m_type,用 4 替换第二次出现的 m_type,对吗?
-
因为顺序很重要,所以不能简单地搜索出现的地方。我建议遍历输入文件,并检查每一行是否匹配。如果该行匹配,则替换值并从您的参数字典中删除使用的项目。
标签: python regex python-3.x replace