考虑以下INI文件:
[TestSettings]
# First comment goes here
environment = test
[Browser]
# Second comment goes here
browser = chrome
chromedriver = default
...
我正在使用Python 2.7来更新ini文件:
config = ConfigParser.ConfigParser()
config.read(path_to_ini)
config.set('TestSettings','environment',r'some_other_value')
with open(path_to_ini, 'wb') as configfile:
config.write(configfile)
如何在不删除注释的情况下更新INI文件。 INI文件已更新,但注释已删除。
[TestSettings]
environment = some_other_value
[Browser]
browser = chrome
chromedriver = default
答案 0 :(得分:8)
ConfigObj会保留comments,并且似乎可以执行您想要的操作。您描述的方案的示例用法:
from configobj import ConfigObj
config = ConfigObj(path_to_ini)
config['TestSettings']['environment'] = 'some_other_value'
config.write()
答案 1 :(得分:6)
回写时擦除配置文件中的注释的原因是write方法根本不处理注释。它只写键/值对。
最简单的方法是使用自定义注释前缀和allow_no_value = True来初始化configparser对象。 如果我们要保留默认的“#”和“;”文件中的注释行,我们可以使用comment_prefixes ='/'。
即,要保留注释,您必须欺骗configparser使其认为这不是注释,此行是没有值的键。有趣的:)
# set comment_prefixes to a string which you will not use in the config file
config = configparser.ConfigParser(comment_prefixes='/', allow_no_value=True)
config.read_file(open('example.ini'))
...
config.write(open('example.ini', 'w'))
答案 2 :(得分:1)
ConfigUpdater
可以更新 .ini
文件并保留评论:pyscaffold/configupdater。
我不知道它是否适用于 Python 2。
来自docs:
<块引用>与 ConfigParser 的主要区别是:
答案 3 :(得分:0)
ConfigObj是几乎所有情况下的最佳选择。
尽管如此,它不支持没有三引号的多行值,就像ConfigParser一样。在这种情况下,可行的选项可以是iniparse。
例如:
[TestSettings]
# First comment goes here
multiline_option = [
first line,
second line,
]
您可以通过这种方式更新多行值。
import iniparse
import sys
c = iniparse.ConfigParser()
c.read('config.ini')
value = """[
still the first line,
still the second line,
]
"""
c.set('TestSettings', 'multiline_option', value=value)
c.write(sys.stdout)