【问题标题】:How to write ini-files without sections?如何编写没有节的ini文件?
【发布时间】:2021-05-14 03:36:33
【问题描述】:

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

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)

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

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

【问题讨论】:

标签: python python-2.7 ini configparser


【解决方案1】:

[注意:以下是为 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

【讨论】:

  • 先做一个buf.readline()(或next(buf))然后再做一个for line in buf:不是更好吗?当然这只是 4 行,使用 readlines() 创建一个最小列表,但一般来说,当您可以直接迭代缓冲区/文件时,最好避免创建这样的列表
【解决方案2】:

由于ConfigParser 不支持这一点,我个人可能会选择对write 方法进行monkeypatch 以支持非部分写入。

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 下对此进行了测试,因此您需要针对 2.7 进行测试/调整。还要记住,自定义ini 的读取需要进行调整/猴子补丁。您还可以将其包装到您自己的自定义 ConfigParser 类中,以便您可以在项目中任何需要的地方重复使用它。

【讨论】:

  • 是的,正是@Tomerikoo,这就是我在底部的澄清中所指的。
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多