configparser处理配置文件
2020-09-11 本文已影响0人
阿登20
configparser
配置文件:以.conf .ini .cfg结尾的格式
a.cfg 配置文件的内容
# 注释1
; 注释2
[section1]
k1 = v1
k2:v2
user=adeng
age=18
is_admin=true
salary=31.5
[section2]
k1 = v1
读取配置文件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
# @Time : 2020/9/9 19:50
# @File : 读配置文件.py
# @Author: adeng
# @Date : 2020/9/9
============================
"""
import configparser
config=configparser.ConfigParser()
config.read('a.cfg',encoding="utf-8")
#查看所有的标题
res=config.sections() #['section1', 'section2']
print(res)
#查看标题section1下所有key=value的key
options=config.options('section1')
print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
#查看标题section1下所有key=value的(key,value)格式
item_list=config.items('section1')
print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
#查看标题section1下user的值=>字符串格式
val=config.get('section1','user')
# val=config["section1"]["user"] # adeng
print(val) #adeng
#查看标题section1下age的值=>整数格式
val1=config.getint('section1','age')
print(val1) #18
#查看标题section1下is_admin的值=>布尔值格式
val2=config.getboolean('section1','is_admin')
print(val2) #True
#查看标题section1下salary的值=>浮点型格式
val3=config.getfloat('section1','salary')
print(val3) #31.5
config.read(文件)报错
pycharm-settings--editor-file Encoding-如下图设置
image.png配置文件: 增 删 改 查
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
# @Time : 2020/9/9 20:21
# @File : 改写配置文件.py
# @Author: adeng
# @Date : 2020/9/9
============================
"""
import configparser
from scripts import handle_file
# 处理文件乱码的情况
handle_file.HanldeFile.change_to_utf8(r"a.cfg")
# 实例化一个ConfigParser 对象,这两步都是固定的。封装时可以放在__init__
config=configparser.ConfigParser()
config.read('a.cfg',encoding='utf-8')
#-------------------增--------------------
# 增操作,一般用在把数据写入配置文件,必须掌握后面封装的时候有用
# 以key1:{key2:value} 添加
config["adeng"] = {"name":"阿登","age":"18"} # 这种添加,adeng存在不会报错
config["adeng"]= {"name":"阿登"}
config["adeng"]= {"name":"1"} # name存在,就是修改阿登=1
# 修改
config["adeng"]["age"]= "3" # 这种修改,必须adeng区域名必须存在
config.write(open('a.cfg','w',encoding="utf8"))
#添加一个标题
config.add_section('egon') # egon存在会报错
#-------------------------查----------------------
# 查
# 1.查看配置文件 所有标题,返回list
res =config.sections()
print(res)
# 2. 查找区域名下面的key,返回list
res = config.options("section1")
print(res)
# 3. #查看区域名下所有key=value的(key,value)格式
res = config.items("section1")
print(res)
# 4. 获取选项名的值
print(config.get("section1","user"))
# 5.config["区域名"]["选项名"]
print(config["section1"]["age"])
#----------------改------------------------
# 改
#在标题egon下添加name=egon,age=18的配置
config.set('egon','name','egon') # 区域名egon 必须存在
config.set('egon','age',"17")
# config.set('egon','age',18) #报错,必须是字符串
config["egon"]["age"]= "16" # 16 必须是str
# ------------------------删---------
#删除整个标题section2
config.remove_section('section2')
# #删除标题section1下的某个k1和k2
config.remove_option('section1','k1')
config.remove_option('section1','k2')
#判断是否存在某个标题
print(config.has_section('section1'))
# 判断标题section1下是否有user
print(config.has_option('section1',''))
#最后将修改的内容写入文件,完成最终的修改
config.write(open('a.cfg','w',encoding="utf8"))
配置文件 封装
rom configparser import ConfigParser
class HandleConfig:
"""
这是一个处理配置文件的类 HandleConfig
"""
# 构造一个__init__函数
def __init__(self, filename):
self.filename = filename
# 实例化1个ConfigParser的对象当做实例变量
self.config = ConfigParser()
# 读数据前必须指定的读取配置文件,并当作一个实例变量
self.config.read(self.filename, encoding="utf8")
# 获取数据是字符串类型 需要传 区域名 选项名
def get_value(self, section, option):
return self.config.get(section, option)
# 获取int数据
def get_int(self, section, option):
return self.config.getint(section, option)
# 获取float数据
def get_float(self, section, option):
return self.config.getfloat(section, option)
# 获取boolean数据
def get_boolean(self, section, option):
return self.config.getboolean(section, option)
# 获取 列表数据 元组 字典数据等等
def get_eval_data(self, section, option):
return eval(self.config.get(section, option))
# return eval(self.get_value(section, option))
# 写入方法的封装
# 需要构造的写入的数据 写入的文件名filename,最好不要在有数据的文件写入
@staticmethod
def write_config(datas, filename):
if isinstance(datas, dict):
for value in datas.values():
if not isinstance(value, dict):
raise TypeError(f"{value}不是一个【字典】")
else:
config = ConfigParser()
for key in datas:
config[key] = datas[key]
with open(filename, "w", encoding="utf8") as file:
config.write(file)
# do_config = HandleConfig("testcase.conf")
if __name__ == '__main__':
do_config = HandleConfig("testcase.conf")
do_config.get_value("file path", "cases_path")
do_config.get_value("file path", "log_path")
do_config.get_int("column", "column1")
do_config.get_eval_data("msg", "value11")
datas = {
"file path": {
"cases_path": "cases.xlsx",
"log_path": "record_run_result.txt"
},
"msg": {
"success_result": "Pass",
"fail_result": "Fail"
},
"column": {
"column1": 6,
"column": 7,
}
} # 嵌套字典的字典
HandleConfig.write_config(datas, "write_config.ini")