有这种类型的数据库。
Database.ini:
[1 StatsObject]
InfoStat=1
[2 StatsObject]
InfoStat=2
etc.
InfoStat值需要乘以特定修饰符。
我将python脚本用于记事本++
import re
FixedStat = 0
StatMod = 20
Result = 0
FixedStatStr = ""
content = editor.getText()
for row, line in enumerate(content.split('\n')):
for m in re.finditer(r'InfoStat=[0-9]+', line):
if(int(m.group(0).split('=').pop()) > 0):
FixedStat = int(m.group(0).split('=').pop())
Result = FixedStat * StatMod
FixedStatStr = 'InfoStat=' + str(Result)
content = re.sub(m.group(0), FixedStatStr, content)
editor.setText(content)
预期结果:
[1 StatsObject]
InfoStat=20
[2 StatsObject]
InfoStat=40
实际结果:
[1 StatsObject]
InfoStat=400
[2 StatsObject]
InfoStat=40
我想在将1转换为20之后, 在将2转换为40的过程中, 20也在变化 因为:
m.group(0) == 'InfoStat = 2'
我使用
re.sub
所有文字
请告诉我如何在特定行中更改InfoStat的值,而又不影响其他人。
答案 0 :(得分:0)
您可以使用split
开头的'\ n \ n`并替换每个部分,例如
import re
FixedStat = 0
StatMod = 20
Result = 0
FixedStatStr = ""
_content_for_demo = """[1 StatsObject]
InfoStat=1
[2 StatsObject]
InfoStat=2
"""
content = editor.getText()
pattern = r'InfoStat=(\d+)'
for section in content.split('\n\n'):
match = re.search(pattern, section)
if match:
value = int(match.group(1)) * StatMod
val = 'InfoStat={}'.format(value)
x = re.sub(match.group(), val, section)
# print(x) debug
editor.setText(content)
答案 1 :(得分:0)
无需评论您为通过特定程序进行驱动而付出的努力,可以通过使用标准库configparser模块大大清理数据的读取。这是一个简化的版本:
Let
...
NewName = "Size_"&Date.ToText(DateTime.Date(DateTime.LocalNow())),
#"Changed Type" = Table.TransformColumnTypes(Sheet1_Table,{{"Size", Int64.Type}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Size", NewName}})
in
#"Renamed Columns"
答案 2 :(得分:0)
如果您要使用正则表达式替换而不是另一个答案中建议的ConfigParser
模块,则最好通过将回调传递给re.sub
而不是固定对象来一次性完成全部操作替换字符串:
import re
STAT_MOD = 20
STAT_EXP = re.compile("(?P<prefix>InfoStat=)(?P<stat>[0-9]+)")
def fixStat(m):
fixed = int(m.group("stat")) * STAT_MOD
return "{}{}".format(m.group("prefix"), fixed)
def fixContent(c):
return STAT_EXP.sub(fixStat, c)
content = editor.getText()
editor.setText(fixContent(content))
答案 3 :(得分:0)
感谢所有答复。
我通过以下方式解决了我的问题:
import configparser
StatMod = 20
config = configparser.ConfigParser()
config.read('Database.ini')
for section in config.sections():
for k, v in config[section].items():
if 'infostat' in k:
OldValue = int(config.get(section, "infostat"))
if (OldValue == 0): continue
# print("OldValue =", OldValue)
NewValue = int(OldValue * StatMod)
# print("NewValue =", NewValue)
config.set(section, "infostat", str(NewValue))
# print(config.get(section, "infostat"))
with open('Database.ini', "w") as config_file:
config.write(config_file)