python:利用configparser模块读写配置文件

半城伤御伤魂 提交于 2020-02-28 00:04:33

一、前言

在项目开发过程中,为了提高代码的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可。
这篇博客,主要介绍python中利用configparser模块读写配置文件的方法。才疏学浅,仅供参考!

二、configparser模块简介

configparser模块支持读取.conf和.ini等类型的文件,其官方模块说明请移步:ConfigParse 官方文档

三、configparser操作配置文件格式

ini文件结构

[section1]
k1 = v1
k2:v2
user=egon
age=18
is_admin=true
salary=31

[section2]
k1 = v1

ini文件结构需要注意一下几点:

  1. 键值对可用=或者:进行分隔
  2. section的名字是区分大小写的,key的名字是不区分大小写的
  3. 键值对中头部和尾部的空白符会被去掉
  4. 值可以为多行
  5. 配置文件可以包含注释,注释以#或者;为前缀

四、configparser的基本使用

创建my.ini文件方便ConfigParser类来解析

[mysqld]
charater-server-set='utf-8'
default-engine='innodb'
skip-grant-table=True
part=3306

[client]
user='root'
password='123456'

上面的 mysqld 和client 称之为: section
上面client中的 user称之为: option
个人更愿意理解为: 组-属性

4.1 读取操作

import configparser

config = configparser.ConfigParser()  # 类中一个方法 #实例化一个对象
config.read('my.ini', encoding="utf-8")  # 读ini文件

print(config.sections())  # 获取所有section节点,返回值为list
print(config.options('mysqld'))     # 获取指定section节点下的所有options的key值
print(config.get('client', 'user'))  # 获取指定的section节点下的指定的key的值(value)
print(config.items('client'))        # 获取指定的section节点下所有的option的key-value

# 判断对应的section或option是否存在:
print(config.has_section('aaa'))   # 判断是否存在对应的section ,如无返回布尔值False
print(config.has_option('client', 'user'))  # 判断section中是否存在对应的option ,如有,返回True


config.get()拓展操作:

# config.get()拓展操作
print(type(config.get('client', 'user')))    # get()方法返回的是 <class 'str'>
print(type(config.getint('mysqld','part')))  # getint()方法直接返回的是<class 'int'>
print(config.getint('mysqld','part'))        # 直接返回 int类型数据:3306,如果该option无int类型数据则报错
print(config.getboolean('mysqld', 'skip-grant-table'))   # 返回布尔值 True
print(config.getfloat('mysqld','part'))   # 返回float类型数据 3306.0

结果:

<class 'str'>
<class 'int'>
3306
True
3306.0

4.2 写入操作

# 新增一个section
config.add_section("emali_tel")
print(config.sections())
# >>>['mysqld', 'client', 'emali_tel']

# section里面新增key和value
config.set("emali_tel", "sender", "yoyo1@tel.com")
config.set("emali_tel", "port", "265")

print(config.items('emali_tel'))   # 打印结果
#>>> [('sender', 'yoyo1@tel.com'), ('port', '265')]

4.3 修改操作

section无法修改,只能先把旧的删除,再重新写入


# 修改option的值。属性不存在时功能为添加。若组不存在会报错。
config.set('mysqld', 'password', 'python2020')  # 将密码改成python2020 ,并新增到mysqld下
print(config.items('mysqld'))

config.set('client', 'password', 'python2020')  # 如果存在,则直接修改
print(config.get('client', 'password'))   # 结果python2020

4.4 删除操作


# 删除一个 section中的一个 item(以键值KEY为标识)
config.remove_option('emali_tel', "port")

items = config.items('emali_tel')
print(items) # list里面对象是元祖  [('sender', 'yoyo1@tel.com')]

# 删除一个 section
config.remove_section('emali_tel')
sects = config.sections()
print(sects)  # list里面对象是元祖   ['mysqld', 'client']

4.5 写入文件

前面讲的remove和set方法并没有真正的修改ini文件内容,只有当执行conf.write()方法的时候,才会修改ini文件内容。


# write写入文件两种方式
config.write(open('my.ini', 'w',encoding='utf-8'))  # 删除原文件重新写入
config.write(open('my2.ini', 'a', encoding='utf-8'))  # 指定编码,追加模式写入新文件

4.6 创建操作

import configparser

config = configparser.ConfigParser()  # 类中一个方法 #实例化一个对象

# 方式一创建
# 创建一个 section,并未section设置一个option ,如果value设置为int类型则会报错
config["DEFAULT"] = {'ServerAliveInterval': '45',
                     'Compression': False,
                     'CompressionLevel': '9'}

# 方式二 创建
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'

# 方式三创建
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'  # mutates the parser
topsecret['ForwardX11'] = 'no'  # same here

# 在DEFAULT下新增一个ForwardX11
config['DEFAULT']['ForwardX11'] = 'yes'

# 写入文件
with open('example1.ini', 'w') as configfile:
    config.write(configfile)   # config.write()写入到创建的文件中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!