1

基于 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 是否以某种方式处理这个问题,或者我应该使用正则表达式......还是?干杯

4

5 回答 5

5

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

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

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

显然,如果分号出现在选项中,您将不得不更有创意。

于 2009-02-19T10:36:28.160 回答
3

最好的方法是编写一个无注释的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)
于 2009-02-19T13:38:19.033 回答
2

看来您的评论不在以评论领导者开头的行上。如果评论领导者是该行的第一个字符,它应该可以工作。

于 2009-02-19T11:40:31.267 回答
1

正如文档所说:“(为了向后兼容,只有 ; 开始一个内联注释,而 # 没有。)”所以使用“;” 而不是 "#" 用于内联注释。它对我来说效果很好。

于 2011-01-12T05:37:27.497 回答
0

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

class MyConfigParser(configparser.RawConfigParser):
    def __init__(self):
      configparser.RawConfigParser.__init__(self, inline_comment_prefixes=('#', ';'))
于 2012-04-20T06:30:42.090 回答