我们有一个示例.cfg文件由键值对组成。根据用户输入,我们需要更新值。我正在考虑使用configParser更新值,但文件没有任何部分(例如[我的部分])。根据文档,它需要设置三个值 - 部分,键和值。不幸的是,我将无法添加任何节标记,因为此文件被其他任务使用。
我们可以根据密钥设置值的另一种方式是什么?
some.status_file_mode = 1 # Some comment
some.example_time = 7200 # Some comment
根据要求,该行没有变化。空格和评论必须与原样相同。
答案 0 :(得分:1)
使用tempfile模块中的NamedTemporaryFile
构建一个简单的解析器来更新看起来像这样的文件并不太难:
/
def replace_key(filename, key, value):
with open(filename, 'rU') as f_in, tempfile.NamedTemporaryFile(
'w', dir=os.path.dirname(filename), delete=False) as f_out:
for line in f_in.readlines():
if line.startswith(key):
line = '='.join((line.split('=')[0], ' {}'.format(value)))
f_out.write(line)
# remove old version
os.unlink(filename)
# rename new version
os.rename(f_out.name, filename)
import os
import tempfile
replace_key('file1', 'some.example_time', 3)
答案 1 :(得分:1)
如果你不关心间距,这适用于你的情况。
def replace_config(filename, key, value):
d = {}
with open(filename, "r+") as f:
for line in f:
k, v = line.split('=')
c = ""
try:
v, c = v.split('#')
except ValueError:
c = ""
d[k.strip()] = {'v': v.strip(), 'c': c.strip()}
f.seek(0)
f.truncate()
d[key]['v'] = value
for k, v in d.items():
if v["c"]:
text = "{} = {} # {}\n".format(k, v['v'], v['c'])
else:
text = "{} = {}\n".format(k, v['v'])
f.write(text)
replace_config('config.cfg', 'some.example_time', 3)