Python學(xué)習(xí)之configparser模塊的使用詳解
1 configparser安裝
pip3 install configparser
2 configparser簡介
用來讀取配置文件的python包;
一般做自動化測試的時候,會使用到這個模塊,用來封裝一些常量。比如數(shù)據(jù)庫、郵件、用戶名密碼、項目常量等等;
這個使用根據(jù)個人喜好和項目來確定,不一定一定要使用這個模塊,也可以使用其它的方法做配置,比如py文件、xml、excel、yaml、json等等。
configparser源碼大約1360行左右,通讀源碼可有效了解該模塊的使用。本文只做簡單介紹常用的方法。
3 表示方法
- 新建一個名為
conf.py
文件; - 寫入如下數(shù)據(jù),格式如下:
[mysqldb] sql_host = 127.0.0.1 sql_port = 3699 sql_user = root sql_pass = 123456 [mailinfo] name = NoamaNelson passwd = 123456 address = 123456@qq.com
4 configparser詳細(xì)使用
4.1 對象初始化
寫入如下代碼,把對象初始化。
# -*- coding:utf-8 -*- # 作者:NoamaNelson # 日期:2021/11/19 # 文件名稱:conf.py # 作用:configparser模塊的使用 # 聯(lián)系:VX(NoamaNelson) # 博客:https://blog.csdn.net/NoamaNelson import configparser import os class Conf: def __init__(self): self.conf = configparser.ConfigParser() self.root_path = os.path.dirname(os.path.abspath(__file__)) self.f = os.path.join(self.root_path + "/config.conf") self.conf.read(self.f)
4.2 獲取所有的sections
def read_sections(self): print(f"1、獲取所有的sections:{self.conf.sections()}") if __name__ == "__main__": aa = Conf() aa.read_sections()
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
4.3 獲取所有的sections對應(yīng)的options
def read_options(self, s1, s2): print(f"2、獲取mysqldb所有的options:{self.conf.options(s1)}") print(f"3、獲取mailinfo所有的options:{self.conf.options(s2)}") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4.4 read方法和get方法,獲取指定section下的option值
read
是讀取配置文件,如self.conf.read(self.f)
是讀取指定config.conf
文件;get
是獲取具體的值;
def read_conf(self, m, n): name = self.conf.get(m, n) # 獲取指定section的option值 print(f"4、獲取指定section:{m}下的option:{n}的值為{name}") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
4.5 items方法,獲取指點(diǎn)section所用配置信息
def get_items(self, m, n): print(f"5、獲取sectoion:{m}下的配置信息為:{self.conf.items(m)}") print(f"6、獲取sectoion:{n}下的配置信息為:{self.conf.items(n)}") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
5、獲取sectoion:mysqldb下的配置信息為:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456')]
6、獲取sectoion:mailinfo下的配置信息為:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]
4.6 set和write方法,修改某個option的值
如果option不存在則創(chuàng)建它;
def set_option(self, m, n, s): self.conf.set(m, n, s) self.conf.write(open(self.f, "w")) print(f"7、設(shè)置setion:{m}下的option:{n}的值為:{s}") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
5、獲取sectoion:mysqldb下的配置信息為:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456')]
6、獲取sectoion:mailinfo下的配置信息為:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]
7、設(shè)置setion:mysqldb下的option:sql_name的值為:游客
因為之前的配置文件中沒有sql_name
,所以會新創(chuàng)建它,如果創(chuàng)建的內(nèi)容存在,直接修改對應(yīng)的值;
4.7 has_section和has_option方法
has_section
方法檢查對應(yīng)的section
是否存在;has_option
方法檢查對應(yīng)的option
是否存在;
def has_s_o(self, s, o): print(f"8、檢查section:{s}是否存在:{self.conf.has_section(s)}") print(f"9、檢查section:{s}下的option:{o}是否存在:{self.conf.has_option(s, o)}") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass', 'sql_name']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
5、獲取sectoion:mysqldb下的配置信息為:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456'), ('sql_name', '游客')]
6、獲取sectoion:mailinfo下的配置信息為:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]
7、設(shè)置setion:mysqldb下的option:sql_name的值為:游客
8、檢查section:mysqldb是否存在:True
9、檢查section:mysqldb下的option:sql_name是否存在:True
4.8 add_section方法,添加section和option
add_section
:添加section
;
添加前:
def add_s_o(self, s, o, v): if not self.conf.has_section(s): self.conf.add_section(s) print(f"10、添加新的section為{s}") else: print(f"10、添加新的section為{s}已經(jīng)存在,無需添加!") if not self.conf.has_option(s, o): self.conf.set(s, o, v) print(f"11、要添加的option為{o}, 值為{v}") else: print(f"11、要添加的option為{o}, 值為{v},已經(jīng)存在,無需添加!") self.conf.write(open(self.f, "w")) if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name") aa.add_s_o("login", "name", "root")
添加后:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass', 'sql_name']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
5、獲取sectoion:mysqldb下的配置信息為:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456'), ('sql_name', '游客')]
6、獲取sectoion:mailinfo下的配置信息為:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]
7、設(shè)置setion:mysqldb下的option:sql_name的值為:游客
8、檢查section:mysqldb是否存在:True
9、檢查section:mysqldb下的option:sql_name是否存在:True
10、添加新的section為login
11、要添加的option為name, 值為root
再次運(yùn)行代碼,會提示已經(jīng)存在:
10、添加新的section為login已經(jīng)存在,無需添加!
11、要添加的option為name, 值為root,已經(jīng)存在,無需添加!
4.9 remove_section和remove_option方法,刪除section和option
def remove_s_o(self, s, o): if self.conf.has_section(s): self.conf.remove_section(s) print(f"12、刪除section:{s}==OK!") else: print(f"12、要刪除的section:{s}不存在,不用刪除!") if self.conf.has_option(s, o): self.conf.remove_option(s, o) print(f"13、刪除section:{s}下的option:{o}==OK!") else: print(f"13、要刪除的section:{s}下的option:{o}不存在,不用刪除!") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name") aa.add_s_o("login", "name", "root") aa.remove_s_o("login", "name")
結(jié)果為:
D:\Python37\python.exe F:/python_study/conf.py
1、獲取所有的sections:['mysqldb', 'mailinfo', 'login']
2、獲取mysqldb所有的options:['sql_host', 'sql_port', 'sql_user', 'sql_pass', 'sql_name']
3、獲取mailinfo所有的options:['name', 'passwd', 'address']
4、獲取指定section:mysqldb下的option:sql_host的值為127.0.0.1
5、獲取sectoion:mysqldb下的配置信息為:[('sql_host', '127.0.0.1'), ('sql_port', '3699'), ('sql_user', 'root'), ('sql_pass', '123456'), ('sql_name', '游客')]
6、獲取sectoion:mailinfo下的配置信息為:[('name', 'NoamaNelson'), ('passwd', '123456'), ('address', '123456@qq.com')]
7、設(shè)置setion:mysqldb下的option:sql_name的值為:游客
8、檢查section:mysqldb是否存在:True
9、檢查section:mysqldb下的option:sql_name是否存在:True
10、添加新的section為login已經(jīng)存在,無需添加!
11、要添加的option為name, 值為root,已經(jīng)存在,無需添加!
12、刪除section:login==OK!
13、要刪除的section:login下的option:name不存在,不用刪除!
5 configparser常見的異常
異常 | 描述 |
---|---|
ConfigParser.Error | 所有異常的基類 |
ConfigParser.NoSectionError | 指定的section沒有找到 |
ConfigParser.DuplicateSectionError | 調(diào)用add_section() 時,section名稱已經(jīng)被使用 |
ConfigParser.NoOptionError | 指定的參數(shù)沒有找到 |
ConfigParser.InterpolationError | 當(dāng)執(zhí)行字符串插值時出現(xiàn)問題時,出現(xiàn)異常的基類 |
ConfigParser.InterpolationDepthError | 當(dāng)字符串插值無法完成時,因為迭代次數(shù)超過了最大的范圍,所以無法完成。InterpolationError的子類 |
InterpolationMissingOptionError | 當(dāng)引用的選項不存在時,會出現(xiàn)異常。InterpolationError的子類 |
ConfigParser.InterpolationSyntaxError | 當(dāng)產(chǎn)生替換的源文本不符合所需的語法時,就會出現(xiàn)異常。InterpolationError的子類。 |
ConfigParser.MissingSectionHeaderError | 當(dāng)試圖解析一個沒有分段標(biāo)題的文件時,會出現(xiàn)異常。 |
ConfigParser.ParsingError | 當(dāng)試圖解析文件時發(fā)生錯誤時,會出現(xiàn)異常 |
ConfigParser.MAX_INTERPOLATION_DEPTH | 當(dāng)raw參數(shù)為false時,get()的遞歸插值的最大深度。這只適用于ConfigParser類 |
6 本文所有源碼
# -*- coding:utf-8 -*- # 作者:NoamaNelson # 日期:2021/11/19 # 文件名稱:conf.py # 作用:configparser模塊的使用 # 聯(lián)系:VX(NoamaNelson) # 博客:https://blog.csdn.net/NoamaNelson import configparser import os class Conf: def __init__(self): self.conf = configparser.ConfigParser() self.root_path = os.path.dirname(os.path.abspath(__file__)) self.f = os.path.join(self.root_path + "/config.conf") self.conf.read(self.f) def read_sections(self): print(f"1、獲取所有的sections:{self.conf.sections()}") def read_options(self, s1, s2): print(f"2、獲取mysqldb所有的options:{self.conf.options(s1)}") print(f"3、獲取mailinfo所有的options:{self.conf.options(s2)}") def read_conf(self, m, n): name = self.conf.get(m, n) # 獲取指定section的option值 print(f"4、獲取指定section:{m}下的option:{n}的值為{name}") def get_items(self, m, n): print(f"5、獲取sectoion:{m}下的配置信息為:{self.conf.items(m)}") print(f"6、獲取sectoion:{n}下的配置信息為:{self.conf.items(n)}") def set_option(self, m, n, s): self.conf.set(m, n, s) self.conf.write(open(self.f, "w")) print(f"7、設(shè)置setion:{m}下的option:{n}的值為:{s}") def has_s_o(self, s, o): print(f"8、檢查section:{s}是否存在:{self.conf.has_section(s)}") print(f"9、檢查section:{s}下的option:{o}是否存在:{self.conf.has_option(s, o)}") def add_s_o(self, s, o, v): if not self.conf.has_section(s): self.conf.add_section(s) print(f"10、添加新的section為{s}") else: print(f"10、添加新的section為{s}已經(jīng)存在,無需添加!") if not self.conf.has_option(s, o): self.conf.set(s, o, v) print(f"11、要添加的option為{o}, 值為{v}") else: print(f"11、要添加的option為{o}, 值為{v},已經(jīng)存在,無需添加!") self.conf.write(open(self.f, "w")) def remove_s_o(self, s, o): if self.conf.has_section(s): self.conf.remove_section(s) print(f"12、刪除section:{s}==OK!") else: print(f"12、要刪除的section:{s}不存在,不用刪除!") if self.conf.has_option(s, o): self.conf.remove_option(s, o) print(f"13、刪除section:{s}下的option:{o}==OK!") else: print(f"13、要刪除的section:{s}下的option:{o}不存在,不用刪除!") if __name__ == "__main__": aa = Conf() aa.read_sections() aa.read_options("mysqldb", "mailinfo") aa.read_conf("mysqldb", "sql_host") aa.get_items("mysqldb", "mailinfo") aa.set_option("mysqldb", "sql_name", "游客") aa.has_s_o("mysqldb", "sql_name") aa.add_s_o("login", "name", "root") aa.remove_s_o("login", "name")
到此這篇關(guān)于Python學(xué)習(xí)之configparser模塊的使用詳解的文章就介紹到這了,更多相關(guān)Python configparser模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!