ini-files没有section怎么写?

How to write ini-files without sections?

我需要创建一个格式如下的文件:

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)

我如何更改它以输出没有虚拟部分的文件 header?我想使用 Python 2.7 来完成它,但是 Python 3 解决方案也会有所帮助(我的想法是我可以将它移植到 Python 2.7)。

This related question 展示了如何通过对代码进行细微调整来读取此类文件。

[注意:下面是为Python3写的;您需要进行一些小的更改才能使其 运行 在 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

由于 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

我已经在 Python 3.8 下测试过,所以你需要 test/adjust 来测试 2.7。还请记住,自定义 ini 的读数需要为 adapted/monkeypatched。您也可以将其包装到您自己的自定义 ConfigParser class 中,以便您可以在项目中任何需要的地方重复使用它。