微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我需要按以下格式创建一个文件

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 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 不支持这一点,我个人可能会选择对 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,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','99')
ini_writer.set('SECTION','34')
ini_writer.set('SECTION','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 的读取需要进行调整/monkeypatched。您还可以将其包装到您自己的自定义 ConfigParser 类中,以便您可以在项目中的任何位置重复使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。