如何解决如何编写没有节的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 举报,一经查实,本站将立刻删除。