[d-6]configparser模块的使用

说明

  • 有很多程序的配置文件经常都是以ini文件,demo格式如下:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no
  • 配置文件解读:
    [ ]里的内容是:section name
    host = 127.0.0.1,左边是option, 右边是value
    • configparser模块提供 了一个类似字典的对象来对此类配置文件进行操作 , .section的名字与其下的各个配置就是一个键值对,而各个配置本身也是一个字典,可以理解为该配置文件是一个嵌套的字典。

configparser的使用

  • 1.建立conf对象
# 使用configparser模块下的ConfigParser类实例化一个对象
import configparser
conf = configparser.ConfigParser()

说明:实例化后的conf对象可以理解为带有其他功能的字典,对于配置内容的增删改查操作可以采用字典的形式进行操作,键就是中括号的section name ,值就是section内部设置的键值对,conf对象提供了其他的一些方法进行操作。

    1. 字典方式操作conf对象
conf["DEFAULT"] = {'ServerAliveInterval': '45',
                     'Compression': 'yes',
                     'CompressionLevel': 9}
conf['bitbucket.org'] = {}
conf['bitbucket.org']['User'] = 'hg'
conf['topsecret.server.com'] = {}
topsecret = conf['topsecret.server.com']
topsecret['Host Port'] = '50022' 
topsecret['ForwardX11'] = 'no'  
conf['DEFAULT']['ForwardX11'] = 'yes'
  • 3.保存配置文件
    保存配置文件的方式是用config对象的write方法,参数是一个file_like_object
with open('example.ini', 'w') as configfile:
   config.write(configfile)

备注:这就完成了建立到写入config文件的过程.注意,config文件里所以的东西都是按照字符串写入的,因为ini文件就是一个文本文件.所以字典里的数字也必须是字符串形式,否则会报错.

打开已经存在的配置文件进行增删改查

  • 字典方法取值
# 读入config文件到已经建立的对象内
config.read('example.ini')
a = config.sections()  # 获得一个不包含DEFAULT section 的其他section名的字符串列表
# 可以对a的内容进行逻辑判断,看看是否存在section;还可以直接通过字典的操作方式拿数据.注意,configparser不区分大小写
print(config['DEFAULT']['Compression'])
for key in config['bitbucket.org'].values():
    print(key)

备注:在取值的时候,for 循环执行之后发现还遍历出了DEFAULT之内的内容,这是因为DEFAULT在遍历其他section的时候默认会被遍历出来;因为配置文件可能用于多用户配置,其他section内的内容可能也存在default内部相同的option,但设置可能覆盖,所以为了查看方便,会将default的内容也列出来,这样在查询的时候,知道每个独立配置哪些地方修改了默认配置,会比较方便.

  • 用config对象方法取值:
print(config.options('bitbucket.org'))  # 取给定section内的所有设置名,连同default的一同取回,返回一个字符串列表
print(config.items('bitbucket.org'))  #取给定section里所有设置的键值对,外加default内的键值对,返回一个元组列表
print(config.get('bitbucket.org','compression')) 
# get方法有和字典相同的内容,比如.get(key,defaultvalue),这里的get方法还可以连续取值,虽然bitbucket.org的section内没有compression这一个配置,但是如果default内有,会从default内取.
# get方法给出默认值参数,如果default section内存在该键,则返回的一定是default内的值,不会返回给定的默认值.
  • 增删改内容

可以直接用字典方法增加和修改新的section以及设置,也可以用config.add()方法来增加:

# 用.add_section方法增加section
config.add_section('new_section')
# 用set方法更新设置,set里直接按顺写写section,option,value名即可.
config.set('new_section','new','test')
# 用remove_section方法删除section,会直接连带其下的所有设置一起删除,删除失败也不会报错
config.remove_section('new_section')
# 用remove_option方法删除一个设置,需要指定section名和option名,删除失败也不会报错
config.remove_option('DEFAULT','forwardx11')
# 在删除的时候,如果不匹配,不会自动删除default的内容.

configparser模块的本质就是一个按照字典进行字处理的模块,在写自己软件的配置文件的时候,可以采用这个模块,比用字处理功能要简便很多.推荐采用config对象的方法操作,用字典的方法略显繁琐.

configparser生成的config对象的方法总结如下:

方法 说明
sections() 返回所有section名组成的列表,不包括DEFAULT
has_section(section_name) 判断section_name是否存在,注意,这其实是在sections()方法的结果里判断,所以default不会包含在内,对default的测试一定返回False
has_option(section, option) 测试一个section下的option是否存在
options(section) 返回section下的所有option名组成的字符串列表,注意,DEFAULT不含在section的可取值范围内,但是返回的结果会包含default内的option名
read(filenames, encoding=None) 读入一个config文件的内容交给对象,可以指定编码.
read_file(f, filename=None) 与read方法功能相同,参数为一个文件对象.
read_string(string) 从符合标准的一个字符串内读入数据交给对象
read_dict(dictionary) 从字典中读入,由于本身config对象就是一个嵌套的字典配置,所以从字典读入也是可以的
get(section, option, raw=False, vars=None, fallback=_UNSET) get方法与字典的get方法不同的是,基于config对象可以直接指定section和option,连续拿2层字典的值.如果当前section找不到,会从DEFAULT里取.此外可以给出默认返回值,但返回值无法覆盖default里的值
items(section=_UNSET, raw=False, vars=None) 如果section不给出,返回的是(section名,section索引)的元组列表,如果给出section名,返回的是那个section下的所有键值对构成的元组的列表.和字典的.items()类似
remove_section(section) 删除指定section和下边所有配置
remove_option(section, option) 删除指定section下的option
set(section, option, value) 直接设定指定section和option的值,相比字典的set方法可以直接穿透两层字典
write(fp, space_around_delimiters=True) 将对象写入到文件对象,如果后边参数设置为True,则option和value之间的等号两边会加上空格,为False则不加空格
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容