在平时的开发中感觉INI格式的配置文件使用还是挺需要的,有时会使用一个单独的py来存放一些常量或者配置项,大多时候这样倒是挺好用的,但是如果某些配置项需要在运行时由用户来修改指定,比如很多app在关闭时会有一个弹出框提示“是否关闭”和“下次不再提醒”,这种配置项如果使用INI格式的配置文件来操作的话就会方便很多,Python中操作配置文件的模块为configparser,这个模块可以用来解析与Windows上INI文件结构类似的文件。

官方文档:https://docs.python.org/3/library/configparser.html

看官方文档的时候发现不同Python版本之间某些API还是有些小区别的,所以先说一下,本文使用的是Python3.6。

一个普通的INI配置文件cfg.ini示例如下:

; DEFAULT为默认section,当获取其他section中同名option,而该section又没有这个option时,会取DEFAULT中的该option
[DEFAULT]
close_prompt = yes [baidu]
website = www.baidu.com # 本机信息
[home]
ip = 127.0.0.1
port = 8080

 INI配置文件组成:

  • section:表示一个区块,由方括号及方括号中的名称组成,section的范围为当前方括号到下一个方括号的内容,如“DEFAULT”,“baidu”,“home”。

    • 大小写和空格检查:section中的名称在保存和获取的时候是原样保存和获取的,即大小写不一样或者空格不一样等都是不同的section;
    • 重复性检查:同一个配置文件中section名称是不允许重复的。
  • option:表示section中的配置项,由key、分隔符和value组成的键值对,如“home”下的“port=8080”。
    • 大小写检查:key是大小写不敏感的,保存进文件的时候会自动将key小写保存,但value是大小写敏感的;
    • 空格检查:通过key获取value时,会自动将文件中的key和value前后空格去掉再进行匹配,即文件中保存为'  ip     = 127.0.0.1      '时,用'ip'也可以获取到对应的value值'127.0.0.1';
    • 跨多行检查:key是不能跨行的,但是value可以跨行,只要第二行即之后的行的缩进与第一行不同即可,一直到下一个option为止;
    • 重复性检查:和section一样,同一section下的key是不允许重复的;
    • 分隔符:可以是等号“=”或者冒号“:”。
  • 注释:行注释用井号“#”或者分号“;”表示,特别需要注意的是必须得是行开头(前面可以有空格),用在行中间的就不会算作是注释了。
  • DEFAULT:这是一个特殊的section,会用作其他section的option取不到值时的备用值,或者可以理解为它是一个root,其他的section都是它的子section,但不是必须提供的。

向配置文件中写数据:

# -*- coding:utf-8 -*-
from configparser import ConfigParser # 使用字典的方式给配置对象添加配置信息
config = ConfigParser()
config['DEFAULT'] = {
'close_prompt': 'yes',
}
config['baidu'] = {}
config['baidu']['website'] = 'www.baidu.com'
config['home'] = {}
home = config['home']
home['ip'] = '127.0.0.1'
home['port'] = '' # 将配置信息写入文件
with open('cfg.ini', 'w') as cfg_file:
config.write(cfg_file)

从配置文件中读取数据:

# -*- coding:utf-8 -*-
from configparser import ConfigParser # 以字典的方式读取配置对象中的数据
config = ConfigParser() print(config.sections()) # 输出:[] # 从配置文件中读取数据,如果配置文件中有中文信息,注意编码
config.read('cfg.ini', encoding='utf-8') print(config.sections()) # 输出:['baidu', 'home']
print('baidu' in config) # 输出:True
print(config['baidu']['website']) # 输出:www.baidu.com home = config['home']
print(home['ip']) # 输出:127.0.0.1
for key in home:
print(key) # 依次输出:ip,port,close_prompt

configparser.ConfigParser

从上面的例子可以看出ConfigParser实例可以像操作字典一样去操作它,每个section对应一个由key/value组成的option字典,虽然可以通过添加和设置section和option等方法来操作,但还是推荐使用字典的方式,可读性也要强一点。其实还有另一个解析类RawConfigParser,与ConfigParser的区别在于前者不允许进行字符串的格式化,而且后者也是继承自前者的,所以这里就只讲ConfigParser。(至于还有一个SafeConfigParser,在Python3.2之后就合道ConfigParser中,跟RawConfigParser和ConfigParser的区别在于可以跨section进行字符串的格式化,这里也不讲了)

初始化方法:ConfigParser(defaults=None, dict_type=_default_dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=DEFAULTSECT, interpolation=_UNSET, converters=_UNSET):

  • defaults:设置配置文件中名为DEFAULT的默认section信息,默认为None,可以传入一个包含option信息的字典;
  • dict_type:设置读取配置信息时的字典类型,默认为有序字典,即collections.OrderedDict,如果实在要考虑性能等原因,可以使用python默认字典dict;
  • allow_no_value:是否允许key没有对应的value,默认为False,如果加载的配置文件中有这种情况,需要手动设置为True;
  • delimiters:设置分隔符,默认为“=”和“:”,且一个option中第二个及之后的分隔符会算作value的一部分;
  • comment_prefixes:设置注释符,默认为“#”和“;”,即一行的开头(取出空格后)为“#”或者“;”,则这一行算作注释内容,包括value有多行的情况也是如此;
  • inline_comment_prefixes:设置行中的注释前缀,即一行中这个符号之后的内容被认为是注释;
  • strict:默认为True,即读取配置数据时不允许出现重复的section和option;
  • empty_lines_in_values:是否允许value中出现空行,默认为True,如果设置为False,则value中的空行将作为这个option的结束标志;
  • default_section:更改默认的section名称,原本默认的section是DEFAULT(注意更改操作需要在实例化之后,读取数据之前);
  • interpolation:设置value的字符串格式化功能,如果不想使用value的字符串格式化功能,可以设置None;
  • converters:设置将value转换为特定类型的数据,参数值为一个字典,字典的key为转换方法的名称,value为对应的转换函数,提供这个字典后,会自动生成对应的get/set方法,比如提供一个字典{'int': int}就会生成getint转换方法(当然这个方法已经内置有了,这里只是举个例子)。

value字符串格式化:可以使用%(name)s进行字符串的格式化,且name只能是本section和DEFAULT中的option项。

自定义option的key配置方式:如原本是key是自动转化为小写的,现在设置其区分大小写:parser.optionxform = lambda option: option(注意更改操作需要在实例化之后,读取数据之前)。

自定义section自定义配置方式:如原本section是包含了空格以及大小写区分的,现在利用正则表达式设置其去掉首位的空格:parser.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")(注意更改操作需要在实例化之后,读取数据之前)。

常用方法:

  • defaults():以字典的方式返回默认的section,即DEFAULT;
  • sections():返回section名称的列表,但是不包括DEFAULT;
  • add_section(section):添加一个section,字符串类型,且已经存在的section不能再往里添加;
  • has_section(section):判断当前配置中是否有此section,DEFAULT不包含在此判断中;
  • options(section):返回此section下的option列表;
  • has_option(section, option):如果指定的section存在,且包含该option,则返回True,否则返回False;如果传入的section为None或者空字符串,则使用DEFAULT这个section进行查找判断;
  • read(filenames, encoding=None):可以传入单个文件,或者多个文件的列表,如果多个文件中某个文件无法打开,则这个文件会被忽略;
  • read_file(f, source=None):从一个文件流(不是文件名称)读取配置,source为文件流的名称;
  • read_string(string, source='<string>'):从一个字符串读取配置,source为字符串的名称;
  • read_dict(dictionary, source='<dict>'):从一个类字典对象中读取配置信息,source为类字典对象的名称;
  • get(section, option, *, raw=False, vars=None[, fallback]):获取section下指定option的值,如果vars被提供了(必须是一个字典),则按照vars、section、DEFAULT这个顺序进行查找。raw指定为True时,option中value值不会自动进行格式化字符串的转换,直接返回原内容。fallback用于指定当查找的option没有时返回的默认值;
  • getint(section, option, *, raw=False, vars=None[, fallback]):将get的值强转成int类型(raw、vars和fallback参数请参考get方法);
  • getfloat(section, option, *, raw=Fasle, vars=None[, ballback]):将get的值强转成float类型(raw、vars和fallback参数请参考get方法);
  • getboolean(section, option, *, raw=False, vars=None[, fallback]):将get的值强转成boolean类型True或False,转换原则为yes/no、on/off、true/false和1/0可以转换为True和False,其他项则会报错(raw、vars和fallback参数请参考get方法)。如果想要自定义转换为True或False的项,可以通过设置parser.BOOLEAN_STATES来定指定,如:parser.BOOLEAN_STATES = {'open': True, 'close': False},但是这时候意味着没在这个字典中的项就会报错了,包括原来的yes/no等项;
  • items((raw=False, vars=None):返回section的迭代器,包括DEFAULT(raw和vars参数请参考get方法);
  • items(section, raw=False, vars=None):返回指定section下option键值对元组的列表(raw和vars参数请参考get方法);
  • set(section, option, value):给指定的section设置一个option键值对;
  • write(fileobject, space_around_delimiters=True):将配置信息写进一个open的文件对象,space_around_delimiters为True时,option的分隔符两边会有空格;
  • remove_option(section, option):移除指定section下的指定option,成功返回True,否则返回False;
  • remove_section(section):移除一个section,如果存在且移除成功,则返回True,否则返回False。

Python学习笔记:configparser(INI格式配置文件解析)的更多相关文章

  1. python学习笔记~INI、REG文件读取函数(自动修复)

    引入configparser,直接read整个INI文件,再调用get即可.但需要注意的是,如果INI文件本身不太规范,就会报各种错,而这又常常不可避免的.本文自定义函数通过try...except. ...

  2. 【Python学习笔记七】从配置文件中读取参数

    将一些需要更改或者固定的内容存放在配置文件中,通过读取配置文件来获取参数,这样修改以及使用起来比较方便 1.首先是配置文件的写法如下一个environment.ini文件: 里面“[]”存放的是sec ...

  3. Python学习笔记(迭代,列表解析,生成器)

    迭代(iterable):支持每次返回自己所包含一个对象的 iter()得到迭代器,.next()遍历列表. 列表解析:根据已有列表高效生成列表的方式. 生成器(Generator): 通过列表生成式 ...

  4. 吴裕雄--天生自然python学习笔记:Python3 JSON 数据解析

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. Python3 中可以使用 json 模块来对 JSON 数据进 ...

  5. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  6. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

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

    在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...

  8. 20180821 Python学习笔记:如何获取当前程序路径

    20180821 Python学习笔记:如何获取当前程序路径 启动的脚本的路径为:D:\WORK\gitbase\ShenzhenHouseInfoCrawler\main.py 当前脚本的路径为:D ...

  9. python学习 day19 configparser模块 os模块 subprocess模块

    上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...

随机推荐

  1. HDU1409 Is It a Number

    http://acm.hdu.edu.cn/showproblem.php?pid=1409 没啥好说的,至今也不知道到底错在哪里了,看了discuss才过的 #include <iostrea ...

  2. hdu2177----取(2堆)石子游戏

    威佐夫博弈博弈论 直接模拟即可 值得一提的是这道题几乎网上所有题解都没有考虑只从小堆取得情况 所以在类似 19 20这种数据出现时,他们都是错误的 只输出了 1 2 而没有 12 20 #includ ...

  3. 自动化测试资源(二):火狐浏览器驱动 geckodriver

    geckodriver:https://github.com/mozilla/geckodriver geckodriver 历史版本下载列表:https://github.com/mozilla/g ...

  4. c++11 右值的学习

    从4行代码看右值引用 概述 简单的左值和右值的判断就是  看是否可以取得地址   可取得地址 是左值     不能则  是右值! c++98/03中的左值引用是这样的: int i = 0; int& ...

  5. Joda-Time简介

    Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. Joda-Ti ...

  6. ubuntu中执行定时任务crontab

    今天研究了下ubuntu里的crontab内置指令.这是设置定时执行脚本任务的指令,我先测试了下最基础的执行. 第一次使用crontab 时,会出现 no crontab for root - usi ...

  7. linux 安装jdk (二进制文件安装)

    1.下载jdk 此处以1.7 为例 :jdk-7u79-linux-x64.tar.gz 2.通过ssh将安装介质传到服务器 我一般放在 /opt 目录下 3.用tar 命令解压缩   tar -zx ...

  8. 9、调整数组顺序使奇数位于偶数前面------------>剑指offer系列

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路 首先寻找第一个 ...

  9. IDEA SpringBoot +thymeleaf配置

    1.pom添加以下依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  10. python的subprocess模块(写的不错留作查询)

    python的subprocess模块 subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*. ...