模块-configparser

 在处理配置文件时苦于读取、修改、增加、删除无法操作,ConfigParser封装了现成的方法,直接调用即可实现。

一、背景介绍

ConfigParser模块在Python3修改为configparser,这个模块定义了一个ConfigeParser类,该类的作用是让配置文件生效。
配置文件的格式和window的ini文件相同,大致如下:
[section]
name=value
name:value
用 = 或 : 来赋值

"#" 和";" 表示注释
[DEFAULT] #设置默认的变量值,初始化

section可以理解为一个模块,比如登录的时候,这个section可以叫login,下面放着username和password
[login]
username=dream
password=abc123

该模块主要使用模块中RawConfigParser(),ConfigParser()、SafeConfigParse()这三个方法(三选一),创建一个对象使用对象的方法对配置文件进行增删改查操作

主要介绍ConfigParser()下的方法
涉及增删改的操作 都需要使用write()方法之后才会生效

add_section():用来新增section
set():用来新增对应section下的某个键值对

configparser 可以读写和解析注释文件, 但是没有写入注释的功能

二、ConfigParser() 方法

 

1、增加配置和键值对

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#使用模块configparser下的ConfigParser方法增加section和键值对
#add_section() 模块,set()键值对
#写入配置文件write()
import configparser
config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
config.read(file)
config.add_section('login')
config.set('login', 'username', 'dream')
config.set('login', 'password', 'abc123')
with open(file, 'w') as configfile:
    config.write(configfile)

结果存入config2.ini,内容如下:
[login]
username = dream
password = abc123

重点说明:在更新配置文件之前,section配置不能存在,否则会报错。

 

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
config.read(file)

#增加分组和配置
config['mysql'] = {}
topsecret = config['mysql']
topsecret['ip'] = '127.0.0.1'
topsecret['port'] = '3306'
with open(file, 'w') as configfile:
    config.write(configfile)

结果:
[mysql]
ip = 127.0.0.1
port = 3306

 

2、修改

read()方法是用来读取配置文件的,如果不加上read()方法,写入是直接从头开始写的(清空原有文件内容并增加新内容)。
使用了read()之后,是从读取完后的光标开始写入,类似追加模式'a'一样(保留原有内容)。

可能有疑惑,既然有追加模式,直接把with里面的'w'换成'a'就可以,干嘛还要读一次
将上面的代码修改一下,将username和password的值修改一下

import configparser
config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
config.read(file)
config.set('login', 'username', '2222')
config.set('login', 'password', '3333')
with open(file, 'w') as configfile:
    config.write(configfile)
    
结果存入config2.ini,内容如下:
[login]
username = 2222
password = 3333

会发现username和password的值被修改了,如果使用'a'模式,会发现报错,没有找到login这个section。
就算把上面代码中加上config.add_section('login')也只会在后面进行追加新增,而不会做修改操作

所以考虑到把方法封装的缘故,使用read()和'w'写入模式,来实现追加新增,修改配置文件

 

3、删除 

一定要先read()到内存,不然删除报错
remove_section()方法删除某个section
remove_option()方法删除某个section下的键

import configparser

config = configparser.ConfigParser()
file ='E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#读入内存
config.read(file)
#删除键值对
config.remove_option('login', 'username')
config.remove_option('login', 'password')
#删除section
config.remove_section('login')
#更新配置(生效)
with open(file, 'w') as configfile:
    config.write(configfile)

4、读取

使用get()方法可以获得指定section下某个键的值

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#读取login模块下的username和password并打印
config.read(file)
username = config.get('login', 'username')
password = config.get('login', 'password')
print(username, password)

输出:dream abc123

sections()方法返回可用的section,默认DEFAULT是不会返回的

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#sections()方法返回可用的section,默认DEFAULT是不会返回的
config.read(file)
section = config.sections()
print(section)

options()返回对应section下可用的键

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#options()返回对应section下可用的键
config.read(file)
key = config.options('login')
print(key)

has_section()方法判断section是否存在,存在返回True,不存在返回False

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#has_section()方法判断section是否存在,存在返回True,不存在返回False
config.read(file)
print(config.has_section('login'))#True
print(config.has_section('test'))#False

has_option()方法判断section下,某个键是否存在,存在返回True,不存在返回False

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
#has_option()方法判断section下,某个键是否存在,存在返回True,不存在返回False
config.read(file)
print(config.has_option('login', 'username'))#True
print(config.has_option('login', 'pass'))#False

items()方法遍历键值对的key和value

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'
config.read(file)

#遍历section-login下所有的key-value,默认会读取section-DEFAULT
for index,key_values in enumerate(config.items('login')):
    print(index,key_values[0],key_values[1])
结果:
[DEFAULT]
0 usernamedd dream
1 passworddd abc123
[login]
2 username dream
3 password abc123

5、其他语法

import configparser

config = configparser.ConfigParser()
file = 'E:/PycharmProjects/PythonStudy/testParse/config2.ini'

config.read(file)

boolean = 'username' in config #判断section是否存在  eg:False

for key in config['login']:  # 遍历对应的section下的key, 与'DEFAULT'组的key
    print(key)

可以遍历section
for i,domain in enumerate(configKey.sections()):
    print("第%s次处理%s" % (i + 1, domain))

 

参考下面的内容,基本涵盖全了,用时查找使用:

  1 #!/usr/bin/env python
  2 # coding=utf-8
  3 # config_configparser.py 配置文件
  4 # configparser 可以读写和解析注释文件, 但是没有写入注释的功能
  5 
  6 import configparser
  7 import re
  8 
  9 config_str = '''
 10 # 配置文件信息案例
 11 [DEFAULT]
 12 minSdkVersion = 15
 13 targetSdkVersion = 24
 14 versionName = 1.0.0
 15 server action = yes
 16 
 17 [dream.me]
 18 user = dream
 19 
 20 # This is a comments.
 21 [mysql]
 22 ip = 127.0.0.1
 23 port = 3306
 24 '''
 25 
 26 def config_write():
 27     '''
 28     生成配置文件, 字典的形式添加数据
 29     '''
 30 
 31     config = configparser.ConfigParser()
 32 
 33     config['DEFAULT'] = {'minSdkVersion': '15',
 34                          'targetSdkVersion': '24',
 35                          'versionName': '1.0.0',
 36                          'server action': 'yes'}
 37 
 38     config['dream.me'] = {}
 39     config['dream.me']['user'] = 'dream'
 40 
 41     config['mysql'] = {}
 42     topsecret = config['mysql']
 43     topsecret['ip'] = '127.0.0.1'
 44     topsecret['port'] = '3306'
 45 
 46     with open('config.ini', 'w') as configfile:
 47         config.write(configfile)
 48 
 49 
 50 def config_read():
 51     '''
 52     解析配置文件
 53     '''
 54 
 55     # 读取
 56     config = configparser.ConfigParser()
 57     config.read('config.ini')
 58 
 59     lists_header = config.sections()  # 配置组名, ['dream.me', 'mysql'] # 不含'DEFAULT'
 60     print(lists_header)
 61 
 62     boolean = 'dream.me' in config  # 配置组是否存在
 63     boolean = config.has_section("dream.me")
 64     print(boolean)
 65 
 66     user = config['dream.me']['user']
 67     print(user)
 68     mysql = config['mysql']
 69     mysql_ip = mysql['ip']
 70     mysql_port = mysql['port']
 71     print(mysql_ip, ":", mysql_port)
 72 
 73     for key in config['dream.me']:  # 遍历配置组的key, 与'DEFAULT'组的key
 74         print(key)
 75 
 76     # 删除
 77     sec = config.remove_section("dream.me")  # 删除
 78     config.write(open("config.ini", "w"))  # 写回去
 79 
 80     # 添加
 81     config.add_section("web.server")
 82     config.write(open("config.ini", "w"))
 83 
 84     # 修改/添加
 85     config.set("web.server", "http", "http://dream.me")
 86     config.write(open("config.ini", "w"))
 87 
 88     # 删除key
 89     config.remove_option("mysql", "ip")
 90     config.write(open("config.ini", "w"))
 91 
 92 
 93 def config_func():
 94     '''
 95     写入的值均为字符串
 96     配合文件的节名称区分大小写, 键不区分大小写(可任意缩进), 注释用'#'和';'(用作整行前缀,可缩进,不推荐行内注释), 值可以跨越多行(要缩进,慎用), 键值分隔符'='和':'
 97     DEFAULT无法移除,试图删除将引发ValueError, clear()保持原样, popitem()不返回
 98     '''
 99 
100     # --- ConfigParser 对象 ---
101     # 配置解析器, defaults:DEFAULT字典, dict_type:字典类型(默认:有序字典), allow_no_value:True是否接收不带值的选项(值为None),(默认False), delimiters:键值分隔符, comment_prefixes:整行注释符, inline_comment_prefixes:行内注释符(值之后), strict:是否去重:True(默认), empty_lines_in_values:值是否可以多行;(默认True),False(行标记选项的结尾), default_section:默认节的名称'DEFAULT', interpolation:插值, converters:转换器{类型转换器的名称, 从字符串转换所需数据的类型}{'dicimal': decimal.Decimal}
102     # class configparser.ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation(), converters={})
103     config = configparser.ConfigParser()
104 
105     # items(raw=False, vars=None)  # 所有节(含DEFAULT) ItemsView(section_name, section_proxy)(可遍历对象)
106     ItemsView = config.items()
107     dicts = config.defaults()  # DEFAULT字典
108     lists = config.sections()  # 可用的节列表(不含DEFAULT)
109     # has_section(section)  # 是否存在该节
110     boolean = config.has_section("mysql")
111     lists = config.options("mysql")  # 指定节的选项列表(含DEFAULT)
112     boolean = config.has_option("mysql", "ip")  # 是否存在指定节的选项
113 
114     # read(filenames, encoding=None)  # 尝试读取和解析文件名列表(不存在则忽略), 加载初始值调用read_file()要在read()之前调用
115     config.read("config.ini", encoding="utf-8-sig")  # windows下用记事本保存utf8格式要用utf-8-sig编码集
116     # read_file(f, source=None)  # 从f读取和解析配置数据, source:文件名
117     config.read_file(open('config.ini', encoding="utf-8-sig"))
118     # read_string(string, source='<string>')  # 从字符串解析配置数据
119     config.read_string(config_str)
120     # read_dict(dictionary, source='<dict>')  # 读取字典
121     config.read_dict({'section1': {'key1': 'value1',
122                                    'key2': 'value2'},
123                       'section2': {'key3': 'value3',
124                                    'key4': 'value4'}
125     })
126 
127     # get(section, option, *, raw=False, vars=None[, fallback])  # 获取指定节的选项值, fallback:为找到选项时的返回值
128     data_str = config.get("mysql", "ip", fallback=None)
129     # getint(section, option, *, raw=False, vars=None[, fallback])  #  获取整数(选项的值强转为整数)
130     data_int = config.getint("mysql", "port", fallback=-1)
131     # getfloat(section, option, *, raw=False, vars=None[, fallback])
132     data = float = config.getfloat("mysql", "port", fallback=-1)
133     # getboolean(section, option, *, raw=False, vars=None[, fallback])
134     data_bool = config.getboolean("DEFAULT", "server action", fallback=False)  # 获取布尔值,不区分大小写,识别'yes'/'no','on'/'off','true'/'false','1'/'0'
135 
136     # write(fileobject, space_around_delimiters=True)  # 将配置写入文件, space_around_delimiters:是否用空格分隔键值之间
137     config.write(open("config.ini", "w", encoding="utf-8"))
138     # add_section(section)  # 添加节, 节重复DuplicateSectionError, 与默认节重复ValueError, 不是字符串TypeError
139     config.add_section("server.dream.me")
140     # remove_section(section) # 删除节, 存在True,不存在False
141     boolean = config.remove_section("server.dream.me")
142     # set(section, option, value)  # 给指定的节设置值, 节不存在NoSectionError, option和value:选项和值为字符串,否则TypeError
143     config.set("server.dream.me", "ip", "127.0.0.1")
144     # remove_option(section, option)  # 删除选型, 不存在节NoSectionError, 选项存在True,不存在False
145     boolean = config.remove_option("server.dream.me", "ip")
146 
147     # optionxform(option)  # 子类重写该方法, 或 config.optionxform = str(str区分大小写) 修改, 用于选项名称转为在内部结构中使用的实现
148 
149     configparser.MAX_INTERPOLATION_DEPTH  # 使用默认插值时,  当raw=false,get()递归插值的最大深度
150 
151     config.clear()  # 所有节都包含'DEFAULT'值,对节的清空不会删除'DEFAULT'值
152     config.BOOLEAN_STATES.update({'enabled': True, 'disabled': False})  # 自定义boolean的判断
153     config.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")  # 自定义节头的编译与解析的正则表达式(去除左右空格)
154 
155 
156 
157     # --- 异常 ---
158     try: pass
159     except configparser.Error: pass  # configparser异常的基类
160     except configparser.NoSectionError: pass  # 未找到指定节
161     except configparser.DuplicateSectionError: pass  # 节重复
162     except configparser.DuplicateOptionError: pass  # 选项重复
163     except configparser.NoOptionError: pass  # 未找到指定选项
164     except configparser.InterpolationError: pass  # 插值异常的基类
165     except configparser.InterpolationDepthError: pass  # 迭代次数超过MAX_INTERPOLATION_DEPTH
166     except configparser.InterpolationMissingOptionError: pass  # 选项不存在
167     except configparser.InterpolationSyntaxError: pass  # 替换源文本不符合语法
168     except configparser.MissingSectionHeaderError: pass  # 没有节头
169     except configparser.ParsingError: pass  # 解析文件错误
170 
171 
172 
173 if __name__ == "__main__":
174     config_write()
175     config_read()
176 
177     # config_func()

三、ConfigParser() 方法练习

configparser模块实例,通过配置文件实现对固定文件内容的更新。

https://www.cnblogs.com/wzh313/articles/9574871.html 

 

posted @ 2018-09-16 01:20  航松先生  阅读(290)  评论(0)    收藏  举报