什么是配置文件
当程序没有任何配置文件时,它对外也就是全封闭的。这种情况下一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件
配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等。配置文件结构大体相似,这里以INI配置文件为例。
INI文件结构需要注意一下几点:
- 配置文件由多个部分组成,每个部分由一个[section]头开头,且section名不可重复
- 配置文件中包含一个或多个 section, 每个 section 有自己的 一个或多个option;
- 键值对使用“=”或者“:”进行分隔
- section的名字是区分大小写的,而key的名字是不区分大小写的
- 键值对中头部和尾部的空白符会被去掉
- 值可以跨多行 ,只要它们缩进的深度比值的第一行深
- 配置文件可以包含注释,注释以“#”或者“;”为前缀,应该避免注解与键或值处在同一行,因为这将导致把注解视为值的一部分。
- 根据解析器的模式,空白行可能被视为多行值的一部分或被忽略
例:
下面是一个非常基础的配置文件,它由多个部分(section)组成,每部分包含了带值的选项。
#类似这样的配置文件,一块一块的分类
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
使用configparser模块读写配置文件
configparser模块
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)。
configparser存在的一些问题
- 不能区分option的大小写;
- 重新写入的配置文件不能保留原有文件的注释;
- 重新写入的配置文件不能保持原有的顺序;
- 不支持嵌套;
- 不支持格式校验;
注意事项:
配置参数读出来都是字符串类型, 参数运算时,注意类型转换,另外,对于字符型参数,不需要加“”
写配置文件
import configparser #引入模块
config = configparser.ConfigParser() #类中一个方法 #实例化一个对象
config["db"] = {'db_port': 8080,
'db_ip': '127.0.0.1',
'db_user':'yuan',
'db_password':123
} #类似于操作字典的形式
#config后面跟的是一个section的名字,section的段的内容的创建类似于创建字典。
config['HTTP'] = {'host':'www.baidu.com',
'port':8800,
'time':'2020年4月17日'} #类似于操作字典的形式
with open('tp.cfg', 'w',encoding="utf-8") as configfile:
config.write(configfile) #将对象写入文件
和字典的操作方式相比,configparser模块的操作方式,无非是在实例化的对象后面,跟一个section,在紧跟着设置section的属性(类似字典的形式)
注意事项:
我们可以看到pycharm默认使用GBK。所以当写入信息中有中文时,会出现乱码的情况。要在with open() 中加上encoding=“utf-8”。
读配置文件
对配置文件的操作有:
- 实例化 configparser 并加载配置文件
- 查看配置文件(对于section)
a、查看配置文件中的所有section
b、根据查询出来的section名查看该section名下的option
c、读取指定的配置信息,此种读取方式获得的值均为字符串str类型
d、按类型读取指定的配置信息,字符串用get,其他都是相对应的类型名字 - 添加(对于section)
- 删除(对于section)
- 判断 option 是否存在
- 修改option对应的值,或添加一个option,都用set()方法
- 删除option
- 保存配置。
import configparser
#1
cf = configparser.ConfigParser()
cf.read("tp.cfg", encoding='utf-8')
#2 a
sections = cf.sections() # 获取配置文件tp.cfg的所有section
print(sections)
#2 b
db_options = cf.options('db') # 获取section为db下的所有option
print(db_options)
values = cf.items('HTTP') # 获取section为HTTP下的所有option键值对
print(values)
#2 c
db_ip_val = cf.get('db', 'db_ip') # 读取配置文件中db_ip对应的值value
print(db_ip_val)
#2 d
port = cf.get('HTTP', 'port')
print(port, type(port))
port = cf.getint('HTTP', 'port')
print(port, type(port))
time1 = cf.get('HTTP','time')
print(time1, type(time1))
#3
cf.add_section('new_section') # 在配置文件中增加一个新的section,section名重复会报错
#4
cf.remove_section('db') #删除名为db的section下所有配置
#5
print(cf.has_option('db', 'db_ip')) #打印结果是:True
#6
cf.set('db', 'db_ip', '127.0.0.2') #修改db_ip的值为127.0.0.2
print(cf.get('db', 'db_ip'))
#7
cf.set('db', 'db_name', 'api_db') #在db下添加一个键为da_name的option,对应值为api_db
#8
cf.remove_option('db', 'time') #删除time一项
print(cf.options('db'))
#9 保存配置写法一。
cf.write(open('tp.cfg', 'w',encode='utf8'))
#9保存配置写法二
with open('tp.cfg','w',encode='utf8') as f:
config.write(f)
注释里面有中文的话,这里代码跟 python2 是有点区别的,python2 里面直接 conf.read(cfgpath) 就可以了,python3 需要加个参数:encoding=“utf-8”
注意:
1、如果配置文件里面写的是数字,读出来默认是字符串
2、如果配置文件中存在一个名为 DEFAULT 的 section,那么其他 section 会扩展DEFAULT的 option 并且可以覆盖它的 option。
3、由于操作并不会将修改结果保存到配置文件,所以写完对配置文件的操作后,一定要通过write保存配置。