文章目录

  • ini文件简介
  • 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)


flutter和android studio哪个开发快 flutter与android studio

目的:Win10安装Flutter, 并配置AndroidStudio环境环境:系统:Centos 7.5 环境:x64问题分析:准备在Windows下使用Flutter开发android应用。所以需要安装Flutter并配置。 Flutter安装及详情可以查看Flutter中文网 https://flutterchina.club/docs/ Windows下Flutter安装及使用需要: Gi