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

Python 如何编写没有节的ini文件?,python,python-2.7,ini,configparser,Python,Python 2.7,Ini,Configparser,我需要创建以下格式的文件: option1 = 99 option2 = 34 do_it = True ... 当我使用ConfigParser时,我必须将所有数据放入一个具有人工名称的节中,然后它创建一个以[section]开头的文件 import ConfigParser ini_writer = ConfigParser.ConfigParser() ini_writer.add_section('SECTION') ini_writer.set('SECTION', 'option

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

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)


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

[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


由于
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
的读取需要调整/修改。您还可以将其包装到自己的自定义
ConfigParser
类中,这样您就可以在项目中需要它的任何地方重用它。

这是否回答了您的问题?第一个链接问了同样的问题,但我更喜欢这里的答案。是的,我也这么认为。即使另一个问题比较老,也可能存在一个相反方向的dupe…做一个
buf.readline()
(或
next(buf)
)然后只做
buf中的行:
,不是更好吗?当然,这只是4行,使用
readlines()
创建一个最小列表,但一般来说,当您可以直接迭代缓冲区/文件库时,最好避免创建这样的列表,这是一个很好的计划。是的,正是@Tomerikoo,这是我在底部的说明中提到的。