2022年 11月 3日

python之ini配置文件(configparser)

前言

使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是configParser

configParser解析的配置文件的格式比较象ini的配置文件格式,就是文件中由多个section构成,每个section下又有多个配置项

ini

1.ini配置文件格式如下:

  1. [section0]
  2. key0 = value0
  3. key1 = value1
  4. [section1]
  5. key2 = value2
  6. key3 = value3

2.section不能重复,里面数据通过section去查找,每个seletion下可以有多个key和vlaue的键值对,注释用英文分号(;)

configparser

1.python3里面自带configparser模块来读取ini文件

  1. # python3
  2. import configParser

敲黑板:python2的版本是Configparser

  1. # python2
  2. import ConfigParser

2.在pycharm里面,新建一个ini文件:右键New->File, 输入框直接写一个.ini后缀文件就行了,然后写数据

3.注释里面有中文的话,这里代码跟python2是有点区别的,python2里面直接conf.read(cfgpath)就可以了,python3需要加个参数:encoding=”utf-8”

敲黑板:如果ini文件里面写的是数字,读出来默认是字符串

  1. # coding:utf-8
  2. # 作者:上海-悠悠
  3. # QQ群:588402570
  4. import configparser
  5. import os
  6. curpath = os.path.dirname(os.path.realpath(__file__))
  7. cfgpath = os.path.join(curpath, "cfg.ini")
  8. print(cfgpath)  # cfg.ini的路径
  9. # 创建管理对象
  10. conf = configparser.ConfigParser()
  11. # 读ini文件
  12. conf.read(cfgpath, encoding="utf-8")  # python3
  13. # conf.read(cfgpath)  # python2
  14. # 获取所有的section
  15. sections = conf.sections()
  16. print(sections)  # 返回list
  17. items = conf.items('email_163')
  18. print(items)  # list里面对象是元祖

运行结果:

  1. D:\debug_p3\cfg\cfg.ini
  2. ['email_qq', 'email_163']
  3. [('sender', 'yoyo@163.com'),
  4. ('psw', '123456'),
  5. ('port', '465'),
  6. ('smtp_server', 'smtp.163.com'),
  7. ('receiver', 'xxx@qq.com')]

remove

1.如果想删除section中的一项,比如我想删除[email_163]下的port 这一行

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

2.删除整个section这一项

conf.remove_section('email_163')

3.参考代码:

  1. # coding:utf-8
  2. import configparser
  3. import os
  4. # 作者:上海-悠悠
  5. # QQ群:588402570
  6. curpath = os.path.dirname(os.path.realpath(__file__))
  7. cfgpath = os.path.join(curpath, "cfg.ini")
  8. print(cfgpath)  # cfg.ini的路径
  9. # 创建管理对象
  10. conf = configparser.ConfigParser()
  11. # 删除一个 section中的一个 item(以键值KEY为标识)
  12. conf.remove_option('email_163', "port")
  13. items = conf.items('email_163')
  14. print(items)  # list里面对象是元祖
  15. # 删除一个 section
  16. conf.remove_section('email_163')
  17. sects = conf.sections()
  18. print(sects)  # list里面对象是元祖

运行结果:

  1. D:\debug_p3\cfg\cfg.ini
  2. [('sender', 'yoyo@163.com'),
  3. ('psw', '123456'),
  4. ('smtp_server', 'smtp.163.com'),
  5. ('receiver', 'xxx@qq.com')]
  6. ['email_qq']

add

1.新增一个section

  1. # 添加一个select
  2. conf.add_section("emali_tel")
  3. print(conf.sections())

2.section里面新增key和value

  1. # 往select添加key和value
  2. conf.set("emali_tel", "sender", "yoyo1@tel.com")
  3. conf.set("emali_tel", "port", "265")

write写入

1.write写入有两种方式,一种是删除原文件内容,重新写入:w

conf.write(open(cfgpath, “w”))  # 删除原文件重新写入

另外一种是在原文件基础上继续写入内容,追加模式写入:a

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

2.前面讲的remove和set方法并没有真正的修改ini文件内容,只有当执行conf.write()方法的时候,才会修改ini文件内容,举个例子:在ini文件上追加写入一项section内容

  1. # coding:utf-8
  2. import configparser
  3. import os
  4. curpath = os.path.dirname(os.path.realpath(__file__))
  5. cfgpath = os.path.join(curpath, "cfg.ini")
  6. print(cfgpath)  # cfg.ini的路径
  7. # 创建管理对象
  8. conf = configparser.ConfigParser()
  9. # 添加一个select
  10. conf.add_section("emali_tel")
  11. print(conf.sections())
  12. # 往select添加key和value
  13. conf.set("emali_tel", "sender", "yoyo1@tel.com")
  14. conf.set("emali_tel", "port", "265")
  15. items = conf.items('emali_tel')
  16. print(items)  # list里面对象是元祖
  17. conf.write(open(cfgpath, "a"))  # 追加模式写入

运行后会发现ini文件最后新增了写入的内容了

 

set修改ini文件

1.比如我想把前面ini文件里面的[email_163]下的port改成”中文”
敲黑板:这里写入中文的话,需要加上写入的编码格式:encoding=”utf-8”

  1. # coding:utf-8
  2. import configparser
  3. import os
  4. # 作者:上海-悠悠
  5. # QQ群:588402570
  6. curpath = os.path.dirname(os.path.realpath(__file__))
  7. cfgpath = os.path.join(curpath, "cfg.ini")
  8. # 创建管理对象
  9. conf = configparser.ConfigParser()
  10. # 先读出来
  11. conf.read(cfgpath, encoding="utf-8")
  12. # 修改section里面的值
  13. conf.set("email_163", "port", "中文")  # 写入中文
  14. conf.write(open(cfgpath, "r+", encoding="utf-8"))  # r+模式