欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-22 11:45:23
文章目录ini文件简介python自带的configparser模块解析ini文件测试文件解析和打印无法解析注释增删改查ini文件简介ini文件一般用来作为配置文件,主要由以下四个部分组成section(节)key(键)value(值)comment(注释):注释以分号为起点组成形式如下:[section]; comment_1key = value ; comment_2python自带的configparser模块解析ini文件测试文件我们先建立一个用来做测试的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) 

本文地址:https://blog.csdn.net/bby1987/article/details/108247671