Python:如何忽略 # 使行不被视为注释?
我在使用配置文件时遇到了一些麻烦,因为选项前面有个#,所以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
方法:
- 从
codecs
模块中子类化StreamWriter
和StreamReader
,用它们来包裹打开过程,实现透明的重新编码。 - 使用
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))