使用 configparser 添加注释

发布于 2024-12-21 16:15:02 字数 306 浏览 3 评论 0原文

我可以使用 python 中的 ConfigParser 模块使用 add_section 和 set 方法创建 ini 文件(请参阅 中的示例http://docs.python.org/library/configparser.html)。但我没有看到任何关于添加评论的信息。这可能吗?我知道如何使用 # 和 ;但如何让 ConfigParser 对象为我添加它呢?我在 configparser 的文档中没有看到任何有关此内容的信息。

I can use the ConfigParser module in python to create ini-files using the methods add_section and set (see sample in http://docs.python.org/library/configparser.html). But I don't see anything about adding comments. Is that possible? I know about using # and ; but how to get the ConfigParser object to add that for me? I don't see anything about this in the docs for configparser.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如果没有 2024-12-28 16:15:02

如果你想摆脱尾随的 =,你可以按照atomocopter的建议子类化 ConfigParser.ConfigParser 并实现你自己的 write 方法来替换原来的:

import sys
import ConfigParser

class ConfigParserWithComments(ConfigParser.ConfigParser):
    def add_comment(self, section, comment):
        self.set(section, '; %s' % (comment,), None)

    def write(self, fp):
        """Write an .ini-format representation of the configuration state."""
        if self._defaults:
            fp.write("[%s]\n" % ConfigParser.DEFAULTSECT)
            for (key, value) in self._defaults.items():
                self._write_item(fp, key, value)
            fp.write("\n")
        for section in self._sections:
            fp.write("[%s]\n" % section)
            for (key, value) in self._sections[section].items():
                self._write_item(fp, key, value)
            fp.write("\n")

    def _write_item(self, fp, key, value):
        if key.startswith(';') and value is None:
            fp.write("%s\n" % (key,))
        else:
            fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))


config = ConfigParserWithComments()
config.add_section('Section')
config.set('Section', 'key', 'value')
config.add_comment('Section', 'this is the comment')
config.write(sys.stdout)

该脚本的输出为:

[Section]
key = value
; this is the comment

注意:

  • 如果您使用名称以 ; 开头的选项名称,并且值设置为 None,则它将被视为评论。
  • 这将允许您添加注释并将其写入文件,但不能读回它们。为此,您需要实现自己的 _read 方法来负责解析注释,并且可能添加一个 comments 方法来获取每个部分的注释。

If you want to get rid of the trailing =, you can subclass ConfigParser.ConfigParser as suggested by atomocopter and implement your own write method to replace the original one:

import sys
import ConfigParser

class ConfigParserWithComments(ConfigParser.ConfigParser):
    def add_comment(self, section, comment):
        self.set(section, '; %s' % (comment,), None)

    def write(self, fp):
        """Write an .ini-format representation of the configuration state."""
        if self._defaults:
            fp.write("[%s]\n" % ConfigParser.DEFAULTSECT)
            for (key, value) in self._defaults.items():
                self._write_item(fp, key, value)
            fp.write("\n")
        for section in self._sections:
            fp.write("[%s]\n" % section)
            for (key, value) in self._sections[section].items():
                self._write_item(fp, key, value)
            fp.write("\n")

    def _write_item(self, fp, key, value):
        if key.startswith(';') and value is None:
            fp.write("%s\n" % (key,))
        else:
            fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t')))


config = ConfigParserWithComments()
config.add_section('Section')
config.set('Section', 'key', 'value')
config.add_comment('Section', 'this is the comment')
config.write(sys.stdout)

The output of this script is:

[Section]
key = value
; this is the comment

Notes:

  • If you use an option name whose name starts with ; and value is set to None, it will be considered a comment.
  • This will let you add comments and write them to files, but not read them back. To do that, you'll have implement your own _read method that takes care of parsing comments and maybe add a comments method to make it possible to get the comments for each section.
在梵高的星空下 2024-12-28 16:15:02

创建一个子类,或更简单:

import sys
import ConfigParser

ConfigParser.ConfigParser.add_comment = lambda self, section, option, value: self.set(section, '; '+option, value)

config = ConfigParser.ConfigParser()
config.add_section('Section')
config.set('Section', 'a', '2')
config.add_comment('Section', 'b', '9')
config.write(sys.stdout)

产生以下输出:

[Section]
a = 2
; b = 9

Make a subclass, or easier:

import sys
import ConfigParser

ConfigParser.ConfigParser.add_comment = lambda self, section, option, value: self.set(section, '; '+option, value)

config = ConfigParser.ConfigParser()
config.add_section('Section')
config.set('Section', 'a', '2')
config.add_comment('Section', 'b', '9')
config.write(sys.stdout)

Produces this output:

[Section]
a = 2
; b = 9
埖埖迣鎅 2024-12-28 16:15:02

为了避免尾随“=”,一旦您将配置实例写入文件

**subprocess.call(['sed','-in',' s/\\(^#.*\\)=/\\n\\1/',filepath])**

filepath 是您使用 ConfigParser 生成的 INI 文件

To avoid the trailing "=" you can use the sed command with subprocess module, once you have written the config instance to a file

**subprocess.call(['sed','-in','s/\\(^#.*\\)=/\\n\\1/',filepath])**

filepath is the INI file you generated using the ConfigParser

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文