模块-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

浙公网安备 33010602011771号