configParser模块详谈
前言
使用配置文件來靈活的配置一些參數(shù)是一件很常見的事情,配置文件的解析并不復(fù)雜,在python里更是如此,在官方發(fā)布的庫中就包含有做這件事情的庫,那就是configParser
configParser解析的配置文件的格式比較象ini的配置文件格式,就是文件中由多個(gè)section構(gòu)成,每個(gè)section下又有多個(gè)配置項(xiàng)
ConfigParser簡介
?
ConfigParser 是用來讀取配置文件的包。配置文件的格式如下:中括號(hào)“[ ]”內(nèi)包含的為section。section 下面為類似于key-value 的配置內(nèi)容。
ConfigParser模塊在python3中修改為configparser.這個(gè)模塊定義了一個(gè)ConfigParser類,該類的作用是使用配置文件生效,配置文件的格式和windows的INI文件的格式相同
該模塊的作用?就是使用模塊中的RawConfigParser()、ConfigParser()、?SafeConfigParser()這三個(gè)方法(三者擇其一),創(chuàng)建一個(gè)對象使用對象的方法對指定的配置文件做增刪改查?操作。配置文件有不同的片段組成和Linux中repo文件中的格式類似:
ini
1、ini配置文件格式如下:
#這是注釋;這里也是注釋[section0]key0 = value0 key1 = value1[section1]key2 = value2 key3 = value3
樣例配置文件example.ini
[db] db_host = 127.0.0.1 db_port = 69 db_user = root db_pass = root host_port = 69[concurrent] thread = 10 processor = 20
2、section不能重復(fù),里面數(shù)據(jù)通過section去查找,每個(gè)seletion下可以有多個(gè)key和vlaue的鍵值對,注釋用英文分號(hào)(;)
configparser
1、python3里面自帶configparser模塊來讀取ini文件
# python3 import configParser?
敲黑板:python2的版本是Configparser
# python2 import ConfigParser?
2、在pycharm里面,新建一個(gè)ini文件:右鍵New->File, 輸入框直接寫一個(gè).ini后綴文件就行了,然后寫數(shù)據(jù)
?
?
3、ConfigParser 初始化對象
使用ConfigParser 首選需要初始化實(shí)例,并讀取配置文件:
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8")?
4、注釋里面有中文的話,這里代碼跟python2是有點(diǎn)區(qū)別的,python2里面直接conf.read(cfgpath)就可以了,python3需要加個(gè)參數(shù):encoding=”utf-8”
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8")?
敲黑板:如果ini文件里面寫的是數(shù)字,讀出來默認(rèn)是字符串
# coding:utf-8 # 作者:古風(fēng)塵import configparser import os curpath = os.path.dirname(os.path.realpath(__file__)) cfgpath = os.path.join(curpath, "demo.ini") print(cfgpath) # demo.ini的路徑# 創(chuàng)建管理對象 conf = configparser.ConfigParser()# 讀ini文件 conf.read(cfgpath, encoding="utf-8") # python3# conf.read(cfgpath) # python2# 獲取所有的section sections = conf.sections()print(sections) # 返回list items = conf.items('db') print(items) # list里面對象是元祖?
運(yùn)行結(jié)果:
D:\debug_p3\cfg\demo.ini ['db_host', 'concurrent','book'] [('db_port', '127.0.0.1'), ('db_user', 'root'), ('db_pass', 'root'), ('hosr_port', '69')]ConfigParser 常用方法
獲取section節(jié)點(diǎn)
1、獲取所用的section節(jié)點(diǎn)
# 獲取所用的section節(jié)點(diǎn) import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") print(config.sections()) #運(yùn)行結(jié)果 # ['db', 'concurrent','book']?
?2、獲取指定section 的options。
即將配置文件某個(gè)section 內(nèi)key 讀取到列表中:
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") r = config.options("db") print(r) #運(yùn)行結(jié)果 # ['db_host', 'db_port', 'db_user', 'db_pass', 'host_port']?
3、獲取指點(diǎn)section下指點(diǎn)option的值
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") r = config.get("db", "db_host") # r1 = config.getint("db", "k1") #將獲取到值轉(zhuǎn)換為int型 # r2 = config.getboolean("db", "k2" ) #將獲取到值轉(zhuǎn)換為bool型 # r3 = config.getfloat("db", "k3" ) #將獲取到值轉(zhuǎn)換為浮點(diǎn)型 print(r) #運(yùn)行結(jié)果 # 127.0.0.1?
4、獲取指點(diǎn)section的所用配置信息
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") r = config.items("db") print(r) #運(yùn)行結(jié)果 #[('db_host', '127.0.0.1'), ('db_port', '69'), ('db_user', 'root'), ('db_pass', 'root'), ('host_port', '69')]?
5、修改某個(gè)option的值,如果不存在則會(huì)出創(chuàng)建
# 修改某個(gè)option的值,如果不存在該option 則會(huì)創(chuàng)建 import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") config.set("db", "db_port", "69") #修改db_port的值為69 config.write(open("ini", "w"))?
[db] db_host = 127.0.0.1 db_port = 69 db_user = root db_pass = root[concurrent] thread = 10 processor = 206、檢查section或option是否存在,bool值 import configparser config = configparser.ConfigParser() config.has_section("section") #是否存在該section config.has_option("section", "option") #是否存在該option
remove
1、如果想刪除section中的一項(xiàng),比如我想刪除[email_163]下的port 這一行
# 刪除一個(gè) section中的一個(gè) item(以鍵值KEY為標(biāo)識(shí)) conf.remove_option('concurrent', "thread")?
2、刪除整個(gè)section這一項(xiàng)
conf.remove_section('concurrent') 3、刪除section 和 option import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") config.remove_section("default") #整個(gè)section下的所有內(nèi)容都將刪除 config.write(open("ini", "w"))?
[db] db_host = 127.0.0.1 db_port = 69 db_user = root db_pass = root[concurrent] thread = 10 processor = 20
add
1、新增一個(gè)section
# 添加一個(gè)select conf.add_section("emali_tel") print(conf.sections())?
2、section里面新增key和value
# 往select添加key和value conf.set("emali_tel", "sender", "yoyo1@tel.com") conf.set("emali_tel", "port", "265")?
3、添加section 和 option import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8") if not config.has_section("default"): # 檢查是否存在sectionconfig.add_section("default") if not config.has_option("default", "db_host"): # 檢查是否存在該optionconfig.set("default", "db_host", "1.1.1.1") config.write(open("ini", "w"))?
[db] db_host = 127.0.0.1 db_port = 69 db_user = root db_pass = root[concurrent] thread = 10 processor = 20[default] db_host = 1.1.1.1
write寫入
1、write寫入有兩種方式,一種是刪除原文件內(nèi)容,重新寫入:w
conf.write(open(cfgpath, "w")) # 刪除原文件重新寫入?
另外一種是在原文件基礎(chǔ)上繼續(xù)寫入內(nèi)容,追加模式寫入:a
conf.write(open(cfgpath, "a")) # 追加模式寫入?
2、前面講的remove和set方法并沒有真正的修改ini文件內(nèi)容,只有當(dāng)執(zhí)行conf.write()方法的時(shí)候,才會(huì)修改ini文件內(nèi)容,舉個(gè)例子:在ini文件上追加寫入一項(xiàng)section內(nèi)容
# coding:utf-8 import configparser import os curpath = os.path.dirname(os.path.realpath(__file__)) cfgpath = os.path.join(curpath, "cfg.ini") print(cfgpath) # cfg.ini的路徑# 創(chuàng)建管理對象 conf = configparser.ConfigParser()# 添加一個(gè)select conf.add_section("emali_tel") print(conf.sections())# 往select添加key和value conf.set("emali_tel", "sender", "yoyo1@tel.com") conf.set("emali_tel", "port", "265") items = conf.items('emali_tel') print(items) # list里面對象是元祖 conf.write(open(cfgpath, "a")) # 追加模式寫入?
運(yùn)行后會(huì)發(fā)現(xiàn)ini文件最后新增了寫入的內(nèi)容了
?3、寫入文件
以下的幾行代碼只是將文件內(nèi)容讀取到內(nèi)存中,進(jìn)過一系列操作之后必須寫回文件,才能生效
import configparser config = configparser.ConfigParser() config.read("ini", encoding="utf-8")
寫回文件的方式如下:(使用configparser的write方法)
config.write(open("ini", "w")) # 刪除原文件重新寫入?
綜合實(shí)例:
#coding=utf-8import ConfigParserdef writeConfig(filename):config = ConfigParser.ConfigParser() #創(chuàng)建ConfigParser實(shí)例# set dbsection_name = 'db'config.add_section( section_name ) #添加一個(gè)配置文件節(jié)點(diǎn)(strconfig.set( section_name, 'dbname', 'MySQL')config.set( section_name, 'host', '127.0.0.1')config.set( section_name, 'port', '80')config.set( section_name, 'password', '123456')config.set( section_name, 'databasename', 'test')# set appsection_name = 'app'config.add_section( section_name )config.set( section_name, 'loggerapp', '192.168.20.2')config.set( section_name, 'reportapp', '192.168.20.3')# write to fileconfig.write( open(filename, 'a') ) #寫入配置文件def updateConfig(filename, section, **keyv):config = ConfigParser.ConfigParser()config.read(filename)print config.sections() #返回配置文件中節(jié)序列for section in config.sections():print "[",section,"]"items = config.items(section) #返回某個(gè)項(xiàng)目中的所有鍵的序列for item in items:print "\t",item[0]," = ",item[1]print config.has_option("dbname", "MySQL")print config.set("db", "dbname", "11") #設(shè)置db節(jié)點(diǎn)中,鍵名為dbname的值(11)print "..............."for key in keyv:print "\t",key," = ", keyv[key]config.write( open(filename, 'r+') )if __name__ == '__main__':file_name = 'test.ini'writeConfig(file_name)updateConfig(file_name, 'app', reportapp = '192.168.100.100')print "end__"轉(zhuǎn)載于:https://www.cnblogs.com/gufengchen/p/10929463.html
總結(jié)
以上是生活随笔為你收集整理的configParser模块详谈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EntityFramework进阶(三)
- 下一篇: 备战秋招——操作系统