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

阳光穿透心脏的1/2处 2022-12-01 11:55 211阅读 0赞

文章目录

  • ini文件简介
  • python自带的configparser模块解析ini文件
    • 测试文件
    • 解析和打印
    • 无法解析注释
    • 增删改查
  • 保存至文件

ini文件简介

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

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

组成形式如下:

  1. [section]
  2. ; comment_1
  3. key = value ; comment_2

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

测试文件

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

  1. [root_folder] ; comment 1
  2. ; comment 2
  3. data = E:\data
  4. label = E:\label
  5. [color]
  6. rect = red
  7. point = green
  8. [line]
  9. type = 8 ; solid line
  10. thickness = 2

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

解析和打印

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

  1. # -*- coding: utf-8 -*-
  2. import configparser
  3. def print_ini(config):
  4. for section in config.sections():
  5. print('[%s]' % section)
  6. for key in config.options(section):
  7. print('%s = %s' % (key, config.get(section, key)))
  8. if __name__ == '__main__':
  9. config = configparser.ConfigParser()
  10. config.read('config.ini')
  11. print_ini(config)

print_ini打印的内容如下:

  1. [root_folder]
  2. data = E:\data
  3. label = E:\label
  4. [color]
  5. rect = red
  6. point = green
  7. [line]
  8. type = 8 ; solid line
  9. thickness = 2

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

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

无法解析注释

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

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

  1. type = 8 ; solid line

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

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

发现其结果是:

  1. 8 ; solid line

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

所以总体来说:

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

增删改查

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

查所有的section名字

  1. config.sections()

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

查某个section中所有的key名字

  1. config.options(section)

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

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

查某个section是否存在

  1. config.has_section(section)

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

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

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

  1. config.has_option(section, key)

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

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

增加一个section

  1. config.add_section(section)

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

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

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

  1. config.set(section, key, value)

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

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

执行后color section变为:

  1. [color]
  2. rect = yellow
  3. point = green
  4. circle = blue

而下面命令则会报错:

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

删除一个section

  1. config.remove_section(section)

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

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

  1. config.remove_option(section, option)

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

保存至文件

  1. with open('config_save.ini', 'w') as fid:
  2. config.write(fid)

发表评论

表情:
评论列表 (有 0 条评论,211人围观)

还没有评论,来说两句吧...

相关阅读