Python为属性文件中的特定键设置值

时间:2018-03-06 03:35:05

标签: python python-2.7 parsing

我们有一个示例.cfg文件由键值对组成。根据用户输入,我们需要更新值。我正在考虑使用configParser更新值,但文件没有任何部分(例如[我的部分])。根据文档,它需要设置三个值 - 部分,键和值。不幸的是,我将无法添加任何节标记,因为此文件被其他任务使用。

我们可以根据密钥设置值的另一种方式是什么?

文件示例

some.status_file_mode    =  1    # Some comment
some.example_time    = 7200     # Some comment 

根据要求,该行没有变化。空格和评论必须与原样相同。

2 个答案:

答案 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)