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 中,以便您可以在项目中任何需要的地方重复使用它。
我需要创建一个格式如下的文件:
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 中,以便您可以在项目中任何需要的地方重复使用它。