常见的配置文件
软件开发过程中,配置文件是经常打交道的东西。对于一些复杂的程序来说,需要使用配置文件来配置一些参数。 比如说,测试环境、预生产环境和生产环境的地址,mysql的地址,帐号,密码等信息。因为部署的环境不同,所对的应内容就不同,在这种情况下就需要根据不同的部署环境配置不同的参数。
通常,配置文件中的内容都是以 key--value 的形式存在。
- py文件
在Python中,字典类型,恰好是 key--value 的形式;变量在某种意义上来说,也是 key--value 的形式。所以,在Python项目中,可以采用.py 文件作为配置文件 - yaml文件
yaml文件是比较新的一种配置文件格式,通俗易懂,在Python、Java和PHP等项目环境中均可使用。但也有个头痛的地方,就是对齐和空格要注意雨露均沾,这个有点像Python的语法,所以在Python项目中经常结合起来使用。 常见的yaml文件后缀为 .yaml 、.yml - ini文件
是windows的系统配置文件所采用的存储格式,统管windows的各项配置,在windows下用的比较多,在Linux下的项目中也能使用。ini文件 是比较传统的配置文件,使用频率还是比较高的,但ini文件 有比较严重缺点,只支持一层参数,太复杂的项目就不适用了,现在逐渐用的比较少了。 其后缀是.ini 。例如:端口配置.ini 。
其余的配置文件,例如conf文件、xml文件,这两种文件,在Python项目中,接触的比较少,这里就不一一举例说明了。
接着以上篇文章logging日志进行举例,通过编写配置文件,来生成不同的日志文件信息。
logger.py
import logging
class LoggerHandler(logging.Logger):
def __init__(self,
name='root',
logger_level= 'DEBUG',
file=None,
logger_format = " [%(asctime)s] %(levelname)s [%(filename)s %(funcName)s] [ line:%(lineno)d ] %(message)s"
):
super().__init__(name)
self.setLevel(logger_level)
fmt = logging.Formatter(logger_format)
if file:
file_handler = logging.FileHandler(file)
file_handler.setLevel(logger_level)
file_handler.setFormatter(fmt)
self.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logger_level)
stream_handler.setFormatter(fmt)
self.addHandler(stream_handler)
py文件
变量方式
pyconfig.py
import time
from configfile import logger
curTime = time.strftime("%Y-%m-%d %H_%M", time.localtime())
file = "Web_Autotest_{}.log".format(curTime)
if __name__ == '__main__':
logger = logger.LoggerHandler(file=file)
logger.info('hello world!')
引入时间模块,设置变量为日志文件名称file ,将file 变量导入LoggerHandler 生成了日志文件Web_Autotest_2021-09-03 10_54.log
类方式
类方式有一个好处,继承。
比如测试环境,日志级别要比较详细,需要debug级别方便定位问题,而生产环境,日志级别只需要info级别即可
pyconfig2.py
import sys
import time
from configfile import logger
curTime = time.strftime("%Y-%m-%d %H_%M", time.localtime())
class LoggerConfig:
name = 'Web_Autotest'
logger_level= 'INFO'
file ="Web_Autotest_{}.log".format(curTime)
class ProductLoggerConfig(LoggerConfig):
logger_level = 'DEBUG'
if __name__ == '__main__':
if sys.platform =='win32':
logger = logger.LoggerHandler(name=LoggerConfig.name,logger_level=LoggerConfig.logger_level,file=LoggerConfig.file)
elif sys.platform =='linux':
logger = logger.LoggerHandler(name=ProductLoggerConfig.name,logger_level=ProductLoggerConfig.logger_level,file=ProductLoggerConfig.file)
else:
logger = logger.LoggerHandler(name=LoggerConfig.name,logger_level=LoggerConfig.logger_level,file=LoggerConfig.file)
logger.info('hello')
logger.debug('world!')
如果系统环境是Windows ,则会使用LoggerConfig 类变量的内容,如果系统环境是linux ,则会使用ProductLoggerConfig 类变量的内容,ProductLoggerConfig 类继承了LoggerConfig 类,所以name 和 file 都是LoggerConfig 类中的变量,唯独 logger_level = 'DEBUG'
yaml文件
yaml文件基础知识
安装:
pip install pyyaml
yaml语法规则:
- 大小写敏感
- 使用缩进表示层级关系,缩进空格数目不重要,只要相同层级的元素左侧对齐即可(虽然编辑器中一个Tab键是4个空格,一般不会出错,但尽量用空格缩进)
# 表示注释
yaml支持的数据结构有3种:
- 对象:键值对的集合,又称映射(mapping)/哈希(hashes)/字典(dictionary)
- 数组:一组按次序排列的值,又称序列(sequence)/列表(list)
- 纯量(scalars):单个的,不可再分的值
对象:对象的一组键值,使用冒号表示(注意:编写的时候最好冒号前后各空一个空格)
animal : dog
类似于python中的字典
{animal : "dog"}
数组:一组连词线构成的行,组成一组数组
- animal
- vegetables
- meet
- people
类似于python中的列表
["animal","vegetables","meet","people"]
复合结构:对象和数组可以结合使用,形成复合结构
language:
- Python
- Java
- PHP
websites:
Python : python.org
Java : java.com
YAML : yaml.org
转换为python形式:
{language:["Python","Java","PHP"],websites:{"Python":"python.org","Java":"java.com","YAML":"yaml.org"}}
yaml作为配置文件
config.yaml
logger:
name : WebAutotest
loggerleve : INFO
file : WebAutotest.log
或者不用加引号,都是一样的
config2.yaml
logger:
name : "WebAutotest"
loggerleve : "INFO"
file : "WebAutotest.log"
python读取yaml文件
yamlconfig.py
import yaml
f = open(r'./config.yaml',encoding='utf-8')
data = yaml.load(f.read(),Loader=yaml.FullLoader)
print(data)
f.close()
结果:
{'logger': {'name': 'WebAutotest', 'loggerleve': 'INFO', 'file': 'WebAutotest.log'}}
python写入yaml文件
yamlconfig.py
import yaml
f = open(r'./config.yaml',encoding='utf-8')
data = yaml.load(f.read(),Loader=yaml.FullLoader)
f.close()
f2 = open(r'./config3.yaml',encoding='utf-8',mode='w')
yaml.dump(data,f2,allow_unicode=True)
f2.close()
此时,新增了一个 config3.yaml 文件,写入的内容就是 config3.yaml
logger:
name : WebAutotest
loggerleve : INFO
file : WebAutotest.log
ini文件
ini文件基础知识
ini结构:
- 片段(section)
- 选项(option)(相当于python字典里的key)
- 值(value)
ini文件作为配置文件
config.ini
[student]
name = ["丽丽","lili"]
age = 18
favor = {"sports":"football","food":"apple"}
python读取ini文件
iniconfig.py
from configparser import ConfigParser
config = ConfigParser()
config.read(r'config.ini',encoding='utf-8')
data = config.get('student','name')
print(data)
print(type(data))
["丽丽","lili"]
<class 'str'>
这个读取方式有点特殊,要先读取片段student ,再通过读取选项name 来获取里面的值 ["丽丽","lili"]
通过python读取的ini文件 里的值,都是字符串类型,所以data 为字符串类型,并不是列表类型,如果内容比较复杂的时候,使用python读取的ini文件里的内容,还要再进行处理, 就会比较麻烦。
所以一般情况下,会使用 yaml 文件作为配置文件,与Python项目进行结合
python修改ini文件
ini文件 里的内容类似于字典,获取value 后,可对其进行修改
iniconfig.py
from configparser import ConfigParser
config = ConfigParser()
config.read(r'../file/config.ini',encoding='utf-8')
config['student']['age'] = '20'
f2 = open(r'../file/config.ini',mode='w',encoding='utf-8')
config.write(f2)
此时,config.ini 文件中,age 变为了20 config.ini
[student]
name = ["丽丽","lili"]
age = 20
favor = {"sports":"football","food":"apple"}
|