python自带的configparser模块解析ini文件

ini文件简介

ini文件一般用来作为配置文件,主要由以下四个部分组成

  • section(节)
  • key(键)
  • value(值)
  • comment(注释):注释以分号为起点

组成形式如下:

[section]
; comment_1
key = value ; comment_2

python自带的configparser模块解析ini文件

测试文件

我们先建立一个用来做测试的ini文件,起名为config.ini,内容如下:

[root_folder]  ; comment 1
; comment 2
      data              =          E:\data          
label = E:\label                 

[color]
rect =                 red
point =                green

[line]
type           =        8      ; solid line
thickness =    2

其中加了很多无意义的空格,用来测试configparser对空格的处理能力。

解析和打印

既然是现成模块,解析代码非常简单,先建立一个ConfigParser()类,然后使用read()方法即可,输入参数是文件名。

# -*- coding: utf-8 -*-
import configparser

def print_ini(config):
    for section in config.sections():
        print('[%s]' % section)
        for key in config.options(section):
            print('%s = %s' % (key, config.get(section, key)))

if __name__ == '__main__':
    config = configparser.ConfigParser()
    config.read('config.ini')
    print_ini(config)

print_ini打印的内容如下:

[root_folder]
data = E:\data
label = E:\label
[color]
rect = red
point = green
[line]
type = 8      ; solid line
thickness = 2

从以上打印的结果可以确认一件事:原配置文件中无意义的空格并没有对解析造成影响,解析结果忽略了这些无意义的空格。

另外需注意:所有的section,key,value都以str类型保存。

无法解析注释

关于注释要特别提出来:configparser无法解析注释。

上面的打印内容有一行是:

type = 8      ; solid line

我们专门把section=line, key=type的value打印出来:

print(config.get('line', 'type'))

发现其结果是:

8    ; solid line

也就是说分号及其后面的; solid line都被算作value的一部分了,而不是作为注释被忽略掉。这会引起bug,是个缺陷。
另外,原配置文件中的两条注释:位于第一行的comment 1和第二行的comment 2被忽略掉了。

所以总体来说:

  • key-value所在行中不能有注释,不然注释会被解析为value的一部分(会引起bug)
  • section行尾的注释和单独占一行的注释会被忽略掉(对使用而言没什么影响,但如果想要再次保存的话那注释就没了)

增删改查

想要用的顺畅,就要把增删改查玩的溜。configparser自带了很多方法可以方便我们使用,下面挑主要的介绍。

查所有的section名字

config.sections()

返回由所有section name组成的list,比如本例中返回的是['root_folder', 'color', 'line']

查某个section中所有的key名字

config.options(section)

输入参数是section的名字。
返回值是section下所有key name组成的list,比如config.options('color')返回['rect', 'point']

请注意:查询key的方法叫options()而不是keys(),名字看着有点难受。

查某个section是否存在

config.has_section(section)

输入参数是section的名字,输出是True或False
比如:

print(config.has_section('color'))      # ==> True
print(config.has_section('param'))      # ==> False

查某个section中的某个key是否存在

config.has_option(section, key)

输入是section和key的名字,输出是True或False
比如:

print(config.has_option('color', 'rect'))       # ==> True
print(config.has_option('color', 'circle'))     # ==> False

增加一个section

config.add_section(section)

输入的section不能是config中的已有section,否则报错。
比如:

config.add_section('param') # success to add a section named param
config.add_section('color') # ==> configparser.DuplicateSectionError: Section 'color' already exists

增加(改变)某个section中的某个key

config.set(section, key, value)

section必需是config中已经存在的。key可以不存在,也可以存在,如果不存在则增加一个key,如果存在则修改key的值。
比如:

config.set('color', 'circle', 'blue')
config.set('color', 'rect', 'yellow')

执行后color section变为:

[color]
rect = yellow
point = green
circle = blue

而下面命令则会报错:

config.set('colors', 'rect', 'yellow') # ==> configparser.NoSectionError: No section: 'colors'

删除一个section

config.remove_section(section)

section如果在config中不存在则什么也不做,如果存在则删除整个section,包括其中所有的key-value。

删除某个section中的某个key-value

config.remove_option(section, option)

section必需存在,否则会报错;option随意,如果存在则删除当前key-value,若不存在则什么也不做。

保存至文件

with open('config_save.ini', 'w') as fid:
    config.write(fid)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值