Python - ConfigParser 抛出注释

发布于 2024-07-14 14:36:31 字数 603 浏览 12 评论 0原文

基于 ConfigParser 模块,我如何过滤并抛出 ini 文件中的每个注释?

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("sample.cfg")

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)

例如。 在上面的基本脚本下面的 ini 文件中,打印出进一步的注释行,如下所示:

something  = 128     ; comment line1
                      ; further comments 
                       ; one more line comment

我需要的是其中只有节名称和纯键值对,没有任何注释。 ConfigParser 是否以某种方式处理这个问题,或者我应该使用正则表达式......或者? 干杯

Based on ConfigParser module how can I filter out and throw every comments from an ini file?

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("sample.cfg")

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)

eg. in the ini file below the above basic script prints out the further comments lines as well like:

something  = 128     ; comment line1
                      ; further comments 
                       ; one more line comment

What I need is having only the section names and pure key-value pairs inside them without any comments. Does ConfigParser handles this somehow or should I use regexp...or? Cheers

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

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

发布评论

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

评论(5

看透却不说透 2024-07-21 14:36:31

根据以 ;开头的 docs 行# 将被忽略。 您的格式似乎不满足该要求。 你能改变你的输入文件的格式吗?

编辑:由于您无法修改输入文件,因此我建议使用类似的内容预先解析它们:

tmp_fname = 'config.tmp'
with open(config_file) as old_file:
    with open(tmp_fname, 'w') as tmp_file:
        tmp_file.writelines(i.replace(';', '\n;') for i in old_lines.readlines())
# then use tmp_fname with ConfigParser

显然,如果选项中存在分号,您将必须更具创意。

according to docs lines starting with ; or # will be ignored. it doesn't seem like your format satisfies that requirement. can you by any chance change format of your input file?

edit: since you cannot modify your input files, I'd suggest pre-parsing them with something along the lines:

tmp_fname = 'config.tmp'
with open(config_file) as old_file:
    with open(tmp_fname, 'w') as tmp_file:
        tmp_file.writelines(i.replace(';', '\n;') for i in old_lines.readlines())
# then use tmp_fname with ConfigParser

obviously if semi-colon is present in options you'll have to be more creative.

墟烟 2024-07-21 14:36:31

最好的方法是编写一个无注释的 file 子类:

class CommentlessFile(file):
    def readline(self):
        line = super(CommentlessFile, self).readline()
        if line:
            line = line.split(';', 1)[0].strip()
            return line + '\n'
        else:
            return ''

然后您可以将它与 configparser (您的代码)一起使用:

import ConfigParser
config = ConfigParser.ConfigParser()
config.readfp(CommentlessFile("sample.cfg"))

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)

Best way is to write a commentless file subclass:

class CommentlessFile(file):
    def readline(self):
        line = super(CommentlessFile, self).readline()
        if line:
            line = line.split(';', 1)[0].strip()
            return line + '\n'
        else:
            return ''

You could use it then with configparser (your code):

import ConfigParser
config = ConfigParser.ConfigParser()
config.readfp(CommentlessFile("sample.cfg"))

for section in config.sections():
    print section
    for option in config.options(section):
        print option, "=", config.get(section, option)
坚持沉默 2024-07-21 14:36:31

您的评论似乎不在以评论领导者开头的行中。 如果评论领导者是该行的第一个字符,那么它应该可以工作。

It seems your comments are not on lines that start with the comment leader. It should work if the comment leader is the first character on the line.

囍笑 2024-07-21 14:36:31

Python 3 附带了一个内置解决方案:类 configparser .RawConfigParser 具有构造函数参数 inline_comment_prefixes。 例子:

class MyConfigParser(configparser.RawConfigParser):
    def __init__(self):
      configparser.RawConfigParser.__init__(self, inline_comment_prefixes=('#', ';'))

Python 3 comes with a build-in solution: The class configparser.RawConfigParser has constructor argument inline_comment_prefixes. Example:

class MyConfigParser(configparser.RawConfigParser):
    def __init__(self):
      configparser.RawConfigParser.__init__(self, inline_comment_prefixes=('#', ';'))
染墨丶若流云 2024-07-21 14:36:31

正如文档所说:“(为了向后兼容,只有 ; 启动内联注释,而 # 则不然。)”所以使用“;” 而不是“#”作为内嵌注释。 它对我来说效果很好。

As the doc said: "(For backwards compatibility, only ; starts an inline comment, while # does not.)" So use ";" and not "#" for inline comments. It is working well for me.

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