zoukankan      html  css  js  c++  java
  • day5-configparser模块

    一、概述

    在软件开发过程中,很多时候需要处理配置文件的读取解析和改写,在python中专门处理配置文件的模块就是configpaser了。顾名思义,configpaser就是配置解析器,可用来对符合格式规范的.conf,ini等配置文件进行解析读取,并支持增删改查、定义新的配置文件等处理。

    二、配置文件格式规范

    可以被configpaser处理的配置文件需符合以下格式规范:

      1 [mysqld]
      2 datadir=/var/lib/mysql
      3 socket=/var/lib/mysql/mysql.sock
      4 user=mysql
      5 # Disabling symbolic-links is recommended to prevent assorted security risks
      6 symbolic-links=0
      7 character-set-server=utf8
      8 
      9 [mysqld_safe]
     10 log-error=/var/log/mysqld.log
     11 pid-file=/var/run/mysqld/mysqld.pid
     12 
     13 [client]
     14 default-character-set=utf8
     15 
     16 [mysql]
     17 default-character-set=utf8
    细心的同学可发现这就是mysql的默认配置文件,类似的还有ansible的hosts文件:
      1 [group1]
      2 host1 var1=value1 var2=value2
      3 host2 var3=value2
      4 [group2]
      5 host3
      6 [group1:children]
      7 group2

    三、configpaser的常见用法

    前文提到,configpaser支持对配置文件的解析读取、增删改查和定义新的配置文件等处理,可满足不同场景下对配置文件的处理需求,下面我们先来创建一个示例配置文件,然后逐一详述读取和增删改查用法。

    3.1 创建配置文件

    创建示例配置文件

      1 import configparser
      2 
      3 config = configparser.ConfigParser()
      4 #开始创建第一个section,类似于list赋值方式,值为dict
      5 config['DEFAULT'] = {'compressionlevel': '9',
      6                      'serveraliveinterval': '45',
      7                       'compression': 'yes'}
      8 config['DEFAULT']['forwardx11'] = 'yes'
      9 #创建第二个section
     10 config['bitbucket.org'] = {}
     11 #类似于通过list的下标来赋值元素
     12 config['bitbucket.org']['user'] = 'hg'
     13 config['topsecret.server.com'] = {}
     14 #通过中间变量来替代
     15 topsecret = config['topsecret.server.com']
     16 topsecret['host port'] = '50022'
     17 topsecret['forwardx11'] = 'no'
     18 #开始写入配置文件
     19 with open('test.conf', 'w', encoding='utf-8') as configfile:
     20     config.write(configfile)

    注意:
    创建的key-value中里面如果有数字,需要加引号变成string形式,否则会报数据类型错误。

    创建的配置文件显示如下:

      1 [DEFALUT]
      2 compressionlevel = 9
      3 serveraliveinterval = 45
      4 compression = yes
      5 forwardx11 = yes
      6 
      7 [bitbucket.org]
      8 user = hg
      9 
     10 [topsecret.server.com]
     11 host port = 50022
     12 forwardx11 = no

    3.2 读取配置文件

    很多场景下我们更多的是需要解析读取其他软件的配置文件,以获取相关的参数信息。

    • 读取section
      section即符合格式规范的配置文件的一级目录,方括号[]包含的部分.sections()方法用于获取配置文件的除default外的所有section,以list形式返回
        1 >>> import configparser
        2 >>> config = configparser.ConfigParser()
        3 >>> config.sections()  #获取section
        4 []
        5 >>> config.read('test.conf') #读取配置文件
        6 ['test.conf']
        7 >>> config.sections() #成功返回section,但不包括default
        8 ['bitbucket.org', 'topsecret.server.com']
        9 >>> config.defaults() #返回default section的键值对
       10 OrderedDict([('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compres
       11 sion', 'yes'), ('forwardx11', 'yes')])
    • 判断section是否存在
        1 >>> 'bitbucket.org' in config
        2 True
        3 >>> 'bitbucket.org1' in config
        4 False
        5 >>> 'DEFAULT' in config
        6 True
        7 >>>
    • 读取section内的值
      获取某个key对应的value可以以类似于list下标的形式获取,options()方法可获取指定section和default在内的所有key,items可获取指定section和default在内的所有key-value对
        1 >>> config.options('bitbucket.org')
        2 ['user', 'compressionlevel', 'serveraliveinterval', 'compression', 'forwardx11']
        3 >>> config.items('bitbucket.org')
        4 [('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'),('forwardx11', 'yes'), ('user', 'hg')]
        5 >>> config['bitbucket.org']['user']
        6 'hg'
        7 >>>
    • 循环获取section内的key值
      可以通过config[‘section_name’]的方式循环获取,也可以通过options方法循环获取
        1 >>> for key in config['bitbucket.org']:
        2 ...     print(key)
        3 ...
        4 user
        5 compressionlevel
        6 serveraliveinterval
        7 compression
        8 forwardx11
        9 >>>
       10 
       11 >>> for key in config.options('bitbucket.org'):
       12 ...     print(key)
       13 ...
       14 user
       15 compressionlevel
       16 serveraliveinterval
       17 compression
       18 forwardx11

    3.3 configpaser的增删改查

    • 读取
      主要的读取方法如下:
    • -read(filename)               直接读取文件内容
      -sections()                      得到所有的section,并以列表的形式返回
      -options(section)             得到该section的所有option
      -items(section)                得到该section的所有键值对
      -get(section,option)         得到section中option的值,返回为string类型
      -getint(section,option)      得到section中option的值,返回为int类型,还有相应的getboolean()和getfloat() 函数。

        1 import configparser
        2 
        3 config = configparser.ConfigParser()
        4 config.read('test.conf')
        5 
        6 print(config.sections())
        7 print(config.options('topsecret.server.com'))
        8 print(config.items('topsecret.server.com'))
        9 print(config.get('topsecret.server.com', 'host port'))
       10 print(type(config.get('topsecret.server.com', 'host port')))
       11 print(config.getint('topsecret.server.com', 'host port'))
       12 print(type(config.getint('topsecret.server.com', 'host port')))
       13 
       14 
       15 程序输出:
       16 ['bitbucket.org', 'topsecret.server.com']
       17 ['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
       18 [('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022')]
       19 50022
       20 <class 'str'>
       21 50022
       22 <class 'int'>
      注意:
      default是一个特殊的全局section,我们获取section时不会返回它,但是当我们在获取其他section的key或者key-value对时,会包括default相应的内容,可以认为它是一个全局缺省的section把。

    • 更改
      通过set方式可实现对已有key-value的修改,如果set的对象不存在,则报错该section不存在
        1 import configparser
        2 
        3 config = configparser.ConfigParser()
        4 config.read('test.conf')
        5 
        6 print(config.get('topsecret.server.com', 'host port'))
        7 config.set('topsecret.server.com', 'host port' ,'60022')
        8 print(config.get('topsecret.server.com', 'host port'))
        9 
       10 结果输出:
       11 50022
       12 60022


    • 增加
      新增section:
        1 >>> import configparser
        2 >>> config = configparser.ConfigParser()
        3 >>> config.read('test.conf')
        4 ['test.conf']
        5 >>> config.has_section('topsecret.server.com')
        6 True
        7 >>> config.has_section('sync_data') #判断是否有该section
        8 False
        9 >>> config.options('topsecret.server.com')
       10 ['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compress
       11 ion']
       12 >>> config.add_section('sync_data') #新增section
       13 >>> config.sections() #新增成功
       14 ['bitbucket.org', 'topsecret.server.com', 'sync_data']
    • 新增option:
      set还有一种用法是为一个存在的section新增option:
        1 import configparser
        2 
        3 config = configparser.ConfigParser()
        4 config.read('test.conf')
        5 
        6 print(config.options('topsecret.server.com'))
        7 #新增option autoreload
        8 config.set('topsecret.server.com', 'autoreload' ,'yes')
        9 print(config.options('topsecret.server.com'))
       10 print(config.items('topsecret.server.com'))
       11 
       12 程序输出:
       13 ['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
       14 ['host port', 'forwardx11', 'autoreload', 'compressionlevel', 'serveraliveinterval', 'compression']
       15 [('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022'), ('autoreload', 'yes')]
       16 #新增option后可以看到多出autoreload,items也能返回它对应的value
      


    • 删除

        1 >>> import configparser
        2 >>> config = configparser.ConfigParser()
        3 >>> config.read('test.conf')
        4 ['test.conf']
        5 >>> config.sections()
        6 ['bitbucket.org', 'topsecret.server.com']
        7 
        8 #开始删除section
        9 >>> config.remove_section('bitbucket.org')
       10 True
       11 >>> config.sections()
       12 ['topsecret.server.com'] #成功删除section
       13 
       14 >>> config.options('topsecret.server.com')
       15 ['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'com
       16 ion']
       17 #开始删除option
       18 >>> config.remove_option('topsecret.server.com','host port')
       19 True
       20 >>> config.options('topsecret.server.com')
       21 ['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression'] #成功删除option
       22 
       23 #删除默认的default的option失败
       24 >>> config.remove_option('topsecret.server.com','compression')
       25 False
       26 >>> config.options('topsecret.server.com')
       27 ['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']

          注意:如果要删除default的全局默认option,必须指定section为default后才能删除 

      1 >>> config.remove_option('DEFAULT','compression')
      2 True
      3 >>> config.options('topsecret.server.com')
      4 ['forwardx11', 'compressionlevel', 'serveraliveinterval']

    • 持久化保存
      上述增、删、改的操作都只是处理了内存中的对象,并没有进行持久化保存,会面临一个重新read后修改又被回滚的问题,这时切记修改完了要立即进行持久化保存处理。保存方法与操作普通文件非常类似:
        1 >>> import configparser
        2 >>> config = configparser.ConfigParser()
        3 >>> config.read('test.conf')
        4 >>> with open('test.conf','w',encoding='utf-8') as configfile:
        5 ...     config.write(configfile)
        6 ...
        7 >>> config.read('test.conf')
        8 ['test.conf']
        9 #持久化保存后重新读取,此前的修改已经生效
       10 >>> config.sections()
       11 ['topsecret.server.com']
       12 >>> config.options('topsecret.server.com')
       13 ['forwardx11', 'compressionlevel', 'serveraliveinterval']

          持久化保存时可指定保存到源文件进行覆盖写处理,也可以另存为其他文件。

  • 相关阅读:
    最小生成数kruskal算法和prim算法
    图的表示及遍历
    mysql忘记root用户密码重置密码的方式
    dwr2.0版本的demo
    web.xml中不同版本的servlet头以及版本控制
    初学jboss
    Filter学习总结,顺便提及点servlet3.0异步filter和异步监听
    监听器
    问题发现和解决
    linux学习
  • 原文地址:https://www.cnblogs.com/linupython/p/8424985.html
Copyright © 2011-2022 走看看