INI 就是英文 “initialization”的头三个字母的缩写;当然INI file的后缀名也不一定是.ini也可以是.cfg.conf 或者是.txt

  • 文件中由多个section构成,每个section下又有多个配置项
  • section不能重复,里面数据通过section去查找,每个seletion下可以有多个key和vlaue的键值对,注释用英文分号(;)
1
2
3
4
5
6
7
8
;这里是注释
[section0]
key0 = value0
key1 = value1

[section1]
key2 = value2
key3 = value3
  • 在section声明后的所有parameters都是属于该section。
  • 对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束,或者是end of the file。
  • Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。

简单使用

  • read(filename): 直接读取文件内容
  • get(section, option): 获取section 下具体某一配置项的值(返回的是字符串)
  • sections() : 得到所有的section,并以列表的形式返回
  • options(section) : 得到该section的所有option
  • items(section) : 键值对的形式 得到该section的所有option
  • getint(section,option)cnf.getboolean(section,option)getfloat(section,option) : 获取整型、布尔型和浮点型的option的值
1
2
3
4
5
6
7
8
9
10
[mysql]
db_ip = 127.0.0.1
db_port = 3306
db_user = mysql
db_pass = mysql

[redis]
redis_ip = 127.0.0.1
redis_port = 3978
redis_user = redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import configparser

# 创建管理对象
conf = configparser.ConfigParser()
# 读ini文件
print(conf.read('config.ini')) # ['config.ini']

# 获取所有sections
sections = conf.sections()
print(sections) # ['mysql', 'redis']

# 获取单个sections里所有key
items = conf.items('mysql')
print(items)
# [('db_ip', '127.0.0.1'), ('db_port', '3306'), ('db_user', 'mysql'), ('db_pass', 'mysql')]

# 或者使用get
conf.get('mysql', 'db_port')

增删改查(并不能修改源文件)

一样可以增删改查:

  • add_section(section) 添加一个新的section
  • set(section, option, value) 对section中添加 option 和 value
  • remove_section(section) 删除某个 section
  • remove_option(section, option) 删除某个 section 下的 option
  • write() 将设置的新的 section 和 option 写到文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 删除mysql这个sections里db_ip(并不会真的删除ini文件的数据)
conf.remove_option('mysql', "db_ip")
print(conf.items('mysql'))
# [('db_port', '3306'), ('db_user', 'mysql'), ('db_pass', 'mysql')]


# 删除整个section
conf.remove_section('mysql')
print(conf.sections()) # ['redis']


# 添加一个select
conf.add_section("mongo")
print(conf.sections()) # ['redis', 'mongo']


# section里面新增key和value
conf.set("mongo", "db_ip", "127.0.0.1")
print(conf.items('mongo')) # [('db_ip', '127.0.0.1')]

# 设置值
conf.set("mongo", "db_ip", "127.0.0.5") # 写入中文

修改源文件

  • 前面讲的remove和set方法并没有真正的修改ini文件内容,
  • 只有当执行conf.write()方法的时候,才会修改ini文件内容
1
2
conf.write(open('conf.ini', "w")) # 删除原文件重新写入
conf.write(open('conf.ini', "a")) # 追加模式写入
1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建管理对象
conf = configparser.ConfigParser()

# 添加一个select
conf.add_section("emali_tel")

# 往select添加key和value
conf.set("emali_tel", "sender", "yoyo1@tel.com")
conf.set("emali_tel", "port", "265")
items = conf.items('emali_tel')
print(items) # list里面对象是元祖

conf.write(open(cfgpath, "a")) # 追加模式写入

操作configparser类来生成配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import configparser

config = configparser.ConfigParser()
config['DEFAULT'] = {'serveraliveinterval' : '4',
'compression' : 'yes',
'compressionlevel' : '9'}

config['bitbucket'] = {}
config['bitbucket']['user'] = 'kk'

config['topsecrect'] = {}
topsecrect = config['topsecrect']

topsecrect['port'] = '22'

with open('example.ini', 'w') as configfile:
config.write(configfile)

直接获取数据类型

一般情况下,configpaser类是无法识别配置文件中的value的数据类型的,它总是以字符串的形式来存储这些类型,所以当涉及到int float等类型的时候就需要我们自己对它进行转换

configparser 为我们提供了getboolean(),getint(), getfloat()方法用来对读对应类型的配置

1
2
3
4
5
6
7
import configparser

config = configparser.ConfigParser()
config.read('example.ini')

port = config['topsecrect'].getint('port')
compression = config.getboolean('DEFAULT', 'compression')

getboolean方法可以识别 yes/no, on/off, true/false , 1/0等数据并转换为布尔值, 其他值都会导致抛出ValueError 异常

[DEFAULT]

configparser有default_section的概念,默认为[DEFAULT]节,也就是之后的所有的section都有该默认section中的键值对

也就是说, 当读取的配置项在不在指定的节里时,ConfigParser 将会到 [DEFAULT] 节中查找

Interpolation

  • 创建ConfigParser()类的时候可以指定interpolation参数,

  • 如果将interpolation设置为BasicInterpolation(),则配置文件中的%(key)s结构会被解析

  • 如,比如example.ini文件内容如下:

    1
    2
    3
    4
    5
    [Paths]
    home_dir: /Users
    ; 使用上面的home_dir
    my_dir: %(home_dir)s/lumberjack
    my_pictures: %(my_dir)s/Pictures
    1
    2
    3
    4
    5
    6
    7
    8
    import configparser
    config = configparser.ConfigParser(interpolation=configparser.BasicInterpolation())

    print(config.read(r'F:\coding\python\example.ini'))
    # ['F:\\coding\\python\\example.ini']

    print(config['Paths']['my_dir'])
    # '/Users/lumberjack'

    %(home_dir)s被解析成了/Users,说白了,相当于配置文件中的变量

  • 也可以使用SafeConfigParser():
    更加智能化,在section中是否存在%()s会自动判断