如何使用python configparser模块解析ini文件中没有值的标签?
例如,我有以下ini,我需要解析rb。在一些ini文件中,rb具有整数值,而在某些文件中没有任何值,如下例所示。如何在没有获得valueerror的情况下使用configparser执行此操作?我使用getint函数
[section]
person=name
id=000
rb=
答案 0 :(得分:11)
创建解析器对象时需要设置allow_no_value=True
可选参数。
答案 1 :(得分:6)
也许使用try...except
块:
try:
value=parser.getint(section,option)
except ValueError:
value=parser.get(section,option)
例如:
import ConfigParser
filename='config'
parser=ConfigParser.SafeConfigParser()
parser.read([filename])
print(parser.sections())
# ['section']
for section in parser.sections():
print(parser.options(section))
# ['id', 'rb', 'person']
for option in parser.options(section):
try:
value=parser.getint(section,option)
except ValueError:
value=parser.get(section,option)
print(option,value,type(value))
# ('id', 0, <type 'int'>)
# ('rb', '', <type 'str'>)
# ('person', 'name', <type 'str'>)
print(parser.items('section'))
# [('id', '000'), ('rb', ''), ('person', 'name')]
答案 2 :(得分:3)
不使用getint()
,而是使用get()
将选项作为字符串。然后自己转换为int:
rb = parser.get("section", "rb")
if rb:
rb = int(rb)
答案 3 :(得分:0)
由于仍有一个关于python 2.6的未解答的问题,以下内容将适用于python 2.7或2.6。这将替换用于解析ConfigParser中的选项,分隔符和值的内部正则表达式。
def rawConfigParserAllowNoValue(config):
'''This is a hack to support python 2.6. ConfigParser provides the
option allow_no_value=True to do this, but python 2.6 doesn't have it.
'''
OPTCRE_NV = re.compile(
r'(?P<option>[^:=\s][^:=]*)' # match "option" that doesn't start with white space
r'\s*' # match optional white space
r'(?P<vi>(?:[:=]|\s*(?=$)))\s*' # match separator ("vi") (or white space if followed by end of string)
r'(?P<value>.*)$' # match possibly empty "value" and end of string
)
config.OPTCRE = OPTCRE_NV
config._optcre = OPTCRE_NV
return config
用作
fp = open("myFile.conf")
config = ConfigParser.RawConfigParser()
config = rawConfigParserAllowNoValue(config)
旁注
在ConfigParser for Python 2.7中有一个OPTCRE_NV,但如果我们在上面的函数中使用它,那么正则表达式将为vi和value返回None,这会导致ConfigParser在内部失败。使用上面的函数为vi和value返回一个空字符串,每个人都很高兴。
答案 4 :(得分:0)
为什么不像这样注释掉rb
选项:
[section]
person=name
id=000
; rb=
然后使用这个很棒的oneliner:
rb = parser.getint('section', 'rb') if parser.has_option('section', 'rb') else None