2

我在使用配置文件时遇到问题,因为该选项以 # 开头,因此 python 将其视为注释(就像它应该的那样)。

配置文件中不起作用的部分:

[channels]
#channel

如您所见,它是一个 IRC 频道,这就是它需要 # 的原因。现在我可以使用一些丑陋的方法来添加 # 每次我需要它,但我更愿意保持它干净。

那么有什么办法可以忽略这一点吗?这样当我要打印选项时,它会以

4

4 回答 4

2

如果您在 python 文件中设置,您可以使用 \ 转义 #

否则我认为这应该在一个配置文件中,其他语法不将 # 视为注释行

于 2013-02-27T22:39:39.120 回答
1

您可能正在使用ConfigParser- 您应该提到 btw - 然后您必须在将配置文件提供给解析器之前对其进行预处理/后处理,因为 ConfigParser 忽略了注释部分。

我可以想到两种方法,它们都使用 readfp,而不是 ConfigParser-class 的 read-method:1)从 codecs-module 子类 StreamWriter 和 StreamReader 并使用它们将打开过程包装在一个透明重新编码。2)StringIOio模块中使用,例如:

from io import StringIO
...
s = configfile.read()
s.replace("#","_")
f = StringIO(unicode(s))
configparser.readfp(f)

如果您不必使用“ini”文件语法,请查看该json模块。我使用它比使用 ini 文件更频繁,特别是如果配置文件不应该由简单用户手动编辑。

my_config={
  "channels":["#mychannel", "#yourchannel"],
  "user"="bob",
  "buddy-list":["alice","eve"],
  }

import json
with open(configfile, 'rw') as cfg:
  cfg.write(json.dumps(my_config))
于 2013-02-27T22:47:21.037 回答
0

ConfigParser 无法不忽略以“#”开头的行。

ConfigParser.py,第 476 行:

        # comment or blank line?
        if line.strip() == '' or line[0] in '#;':
            continue

没办法关掉。

于 2013-02-27T22:46:30.090 回答
0

在您的辩护中,ConfigParser 让您犯了这个错误:

import sys
import ConfigParser

config = ConfigParser.RawConfigParser()
config.add_section('channels')
config.set('channels', '#channel', 'true')

config.write(sys.stdout)

产生这个输出:

[channels]
#channel = true

但是,您可以给出以类似开头的部分名称#

import sys
import ConfigParser

config = ConfigParser.RawConfigParser()
config.add_section('#channels')
config.set('#channels', 'channel', 'true')

config.write(sys.stdout)

with open('q15123871.cfg', 'wb') as configfile:
    config.write(configfile)

config = ConfigParser.RawConfigParser()
config.read('q15123871.cfg')
print config.get('#channels', 'channel')

产生输出:

[#channels]
channel = true

true
于 2013-02-27T23:28:31.753 回答