Python:如何忽略 # 使行不被视为注释?

2 投票
4 回答
2455 浏览
提问于 2025-04-17 17:22

我在使用配置文件时遇到了一些麻烦,因为选项前面有个#,所以Python把它当成注释处理了(这本来就是应该的)。

这个配置文件中不工作的部分是:

[channels]
#channel

如你所见,这是一个IRC频道,所以它需要这个#。我可以用一些笨拙的方法,每次需要的时候都加上#,但我更希望保持代码的整洁。

那么有没有办法忽略这个问题呢?这样当我打印这个选项时,它就可以以

4 个回答

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
2

如果你是在一个Python文件里设置这个,可以用反斜杠\来让#符号不被当作注释。

否则,我觉得这个应该放在一个配置文件里,因为配置文件的其他语法不会把#当成注释行。

1

你可能在使用 ConfigParser,顺便提一下,你应该提到这一点。然后你需要在把配置文件交给解析器之前,先对它进行一些处理,因为 ConfigParser 会忽略掉注释部分。

我想到两种方法,它们都使用了 readfp,而不是 ConfigParser 类的 read 方法:

  1. codecs 模块中子类化 StreamWriterStreamReader,用它们来包裹打开过程,实现透明的重新编码。
  2. 使用 io 模块中的 StringIO,像这样:
from io import StringIO
...
s = configfile.read()
s.replace("#","_")
f = StringIO(unicode(s))
configparser.readfp(f)

如果你不需要使用 "ini" 文件的语法,可以看看 json 模块。我更常用它来做配置,尤其是当配置文件不应该被普通用户手动编辑的时候。

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))

撰写回答