代码之家  ›  专栏  ›  技术社区  ›  anatolyg

如何编写没有节的ini文件?

  •  0
  • anatolyg  · 技术社区  · 5 年前

    我需要创建以下格式的文件:

    option1 = 99
    option2 = 34
    do_it = True
    ...
    

    当我使用 ConfigParser ,我必须将所有数据放入一个带有人工名称的节中,然后它会创建一个以 [SECTION] .

    import ConfigParser
    
    ini_writer = ConfigParser.ConfigParser()
    ini_writer.add_section('SECTION')
    ini_writer.set('SECTION', 'option1', 99)
    ini_writer.set('SECTION', 'option2', 34)
    ini_writer.set('SECTION', 'do_it', True)
    with open('my.ini', 'w') as f:
        ini_writer.write(f)
    

    如何更改它,使其在不使用伪节头的情况下输出文件?我希望使用Python2.7实现这一点,但Python3解决方案也会有所帮助(我的想法是可以将其移植到Python2.7)。

    This related question 演示如何使用对代码的微小调整来读取此类文件。

    0 回复  |  直到 5 年前
        1
  •  1
  •   larsks    5 年前

    [NB:下面是为Python 3编写的;您需要做一些小的更改,使其在Python 2下运行。]

    也许是这样的;在这里,我写信给 io.StringIO 对象,然后将第一行以外的所有内容写入目标文件。

    import configparser
    import io
    
    
    buf = io.StringIO()
    
    ini_writer = configparser.ConfigParser()
    ini_writer.set('DEFAULT', 'option1', '99')
    ini_writer.set('DEFAULT', 'option2', '34')
    ini_writer.set('DEFAULT', 'do_it', 'True')
    ini_writer.write(buf)
    
    buf.seek(0)
    next(buf)
    with open('my.ini', 'w') as fd:
        fd.write(buf.read())
    

    通过使用节名 DEFAULT 我们不必先创建一个新的部分。

    这导致:

    $ cat my.ini
    option1 = 99
    option2 = 34
    do_it = True
    
    
        2
  •  0
  •   yvesonline    5 年前

    ConfigParser 如果不支持这一点,我个人可能会选择monkeypatch write 方法来支持非节编写。

    from configparser import ConfigParser
    
    
    def _write_section_custom(self, fp, section_name, section_items, delimiter):
        for key, value in section_items:
            value = self._interpolation.before_write(self, section_name, key, value)
            if value is not None or not self._allow_no_value:
                value = delimiter + str(value).replace('\n', '\n\t')
            else:
                value = ''
            fp.write('{}{}\n'.format(key, value))
        fp.write('\n')
    
    
    ini_writer = ConfigParser()
    ConfigParser._write_section = _write_section_custom
    ini_writer.add_section('SECTION')
    ini_writer.set('SECTION', 'option1', '99')
    ini_writer.set('SECTION', 'option2', '34')
    ini_writer.set('SECTION', 'do_it', 'True')
    with open('my.ini', 'w') as f:
        ini_writer.write(f)
    

    由此我得到:

    $ cat my.ini 
    option1 = 99
    option2 = 34
    do_it = True
    

    我已经在Python3.8下测试了这一点,所以您需要针对2.7进行测试/调整。还请记住,阅读的习惯 ini 需要调整/修补。你也可以把它包装成一个定制的 配置分析器 类,以便在项目中需要的任何地方都可以重用。

    推荐文章