欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python操作配置文件實戰(zhàn)記錄

 更新時間:2023年11月30日 08:46:00   作者:自動化測試學習官  
這篇文章主要給大家介紹了關(guān)于python操作配置文件的相關(guān)資料,配置文件是為程序配置參數(shù)和初始設(shè)置的文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一:配置文件

1. 什么是配置文件

配置文件是為程序配置參數(shù)和初始設(shè)置的文件。一般為文本文件,以ini,conf,cnf,cfg,yaml等作為后綴名。

例如mysql的配置文件my.cnf內(nèi)容如下:

[mysqld]
# Only allow connections from localhost
bind-address = 0.0.0.0
mysqlx-bind-address = 127.0.0.1
default_authentication_plugin = mysql_native_password

2.配置文件的作用

通過配置文件可以使得代碼中的參數(shù)根據(jù)配置文件進行動態(tài)配置,而不用直接修改代碼的內(nèi)部,減少風險提高代碼復(fù)用。

經(jīng)典應(yīng)用場景

  • 多個函數(shù)調(diào)用同一參數(shù),這個時候最好進行配置化,改動配置文件就可以修改所有函數(shù)
  • 某個參數(shù)需要能夠動態(tài)改變

3.常見配置文件

3.1 ini/conf/cnf文件

這類配置文件由節(jié)(section),鍵(key),值(value)由一下格式組成。

[section1]
key1=value1
key2=value2
[section2]
key1=value1

3.2 yaml文件

3.2.1 簡介

yaml文件本質(zhì)上是一種標記語言,和普通的配置文件相比它能表示更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

它的基本語法規(guī)則如下:

  • 大小寫敏感
  • 使用縮進表示層級關(guān)系
  • 縮進時不允許使用Tab鍵,只允許使用空格。
  • 縮進的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可

# 表示行注釋

yaml支持三種數(shù)據(jù)結(jié)構(gòu):

  • 對象: 鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典 (dict)
  • 數(shù)組: 一組有順序的值,又稱為序列/ 列表(List)
  • 標量:單個值

3.2.2 對象

對象的一組鍵值對使用冒號結(jié)構(gòu)表示

name: xinlan
person: {name: xinlan, age: 18}

3.2.3 數(shù)組

一組連字符開頭的行,構(gòu)成一個數(shù)組

- title
- username
- password
args: [title, username, password]

3.2.4 組合結(jié)構(gòu)

對象數(shù)組可以結(jié)合使用,形成組合結(jié)構(gòu)

name: xinlan
age: 18
hobby: [python, 游戲, sport]
ouxiang: 
  - 
    name: 劉德華
    age: 60
  - 
    name: 任達華
    age: 65

3.2.5 標量

yaml可以表示如下數(shù)據(jù)類型如下:

  • 字符串 默認字符串不要加引號,如果有特殊字符串,用引號包裹
  • 布爾值 true,false
  • 整數(shù)
  • 浮點數(shù)
  • Null - 表示null
  • 時間 iso8601 1949-10-01t09:00:00+08:00
  • 日期 1949-10-01

二:解析配置文件

1.ConfigParser模塊

python提供內(nèi)置庫ConfigParser用來解析ini格式的配置文件。

[log]
filename=py45.log
debug=false
[mysql]
host=127.0.0.1
database=lemon
user=root
password=123456
port=3306
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/15 21:31
# @Author  : shisuiyi
# @File    : read_ini.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
 
config = ConfigParser()  # 實例化
config.read('config.ini')  # 讀取配置文件
print(config.sections())  # 返回所有的section名稱字符串,一列表返回
print(config.options('mysql'))  # 返回指定section下對應(yīng)的配置項的所有的字符串名稱,以列表返回
print(config.items('log'))  # 返回指定section下所有的配置項的鍵值對,二元元組
print(config.get('mysql', 'port'))
print(config.getint('mysql', 'port'))  # 指定類型,幫我們轉(zhuǎn)換類型
print(config["mysql"]['host'])  # 直接以字典取值的方式讀取ini文件

輸出

C:\Users\12446\AppData\Local\Programs\Python\Python39\python.exe D:/Lemon/py45/day19/read_ini.py
['log', 'mysql']
['host', 'database', 'user', 'password', 'port']
[('filename', 'py45.log'), ('debug', 'false')]
3306
3306
127.0.0.1
 
Process finished with exit code 0

2.pyyaml模塊

python解析yaml文件需要安裝第三方庫pyyaml。

pip安裝pip install pyyaml

pyyaml庫的使用非常簡單,它會將整個yaml配置文件內(nèi)容解析成一個python字典返回。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:22
# @Author  : shisuiyi
# @File    : read_yaml.py
# @Software: win10 Tensorflow1.13.1 python3.9
import yaml
 
with open('config.yaml', 'r', encoding='utf-8') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)
    print(config)

輸出的是字典

{'log': {'filename': 'py45.log', 'debug': False},
 'mysql': {'host': '127.0.0.1',
  'database': 'lemon',
  'user': 'root',
  'password': '123456',
  'port': 3306}}

3.配置文件解析模塊封裝

3.1 功能分析

封裝前,我們先考慮一下,這個配置文件解析模塊需要哪些功能?

  • 能夠處理多種配置文件
  • 返回值數(shù)據(jù)結(jié)構(gòu)一致

3.2 封裝成函數(shù)

封裝思路:

  • 輸入?yún)?shù)為配置文件名,以及配置文件字符編碼
  • 根據(jù)配置文件名獲取配置文件后綴判斷配置文件類型,然后分別處理
  • ini配置文件解析后處理成字典,其實也可以不出處理,ConfigParser對象支持字典格式的取值
  • ini配置文件解析的一個重要的問題時,不能自動識別配置類型,所以解耦不是很徹底,有時候需要在引用代碼中另外處理。
  • yaml庫直接解析數(shù)據(jù)為一個字典,且自動識別數(shù)據(jù)類型,不需要做其他處理。

代碼封裝如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:33
# @Author  : shisuiyi
# @File    : congig_handler.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
import yaml
 
def get_config(filename, encoding='utf-8'):
    """
    獲取yaml/ini配置文件中的配置
    @param filename: str 文件名
    @param encoding: 文件字符編碼
    """
    # 1. 獲取配置文件后綴
    suffix = filename.split('.')[-1]
    # 2.判斷類型
    # 3.分別處理
    if suffix in ['yaml', 'yml']:
        with open(filename, 'r', encoding=encoding) as f:
            data = yaml.load(f, Loader=yaml.FullLoader)
    else:
        conf = ConfigParser()
        conf.read(filename)
        data = {}
        for section in conf.sections():
            data[section] = dict(conf.items(section))
    # 4. 返回
    return data
 
if __name__ == '__main__':
    res = get_config(r'D:\Lemon\py45\day18\config.yaml')
    print(res)

3.3 封裝成類

封裝思路:

  • 整體思路和上面的函數(shù)封裝是一致的
  • 將解析ini文件和yaml文件的邏輯分開放到兩個私有方法中
  • 因為邏輯本身比較簡單,面向?qū)ο蠓庋b和函數(shù)封裝沒有太多區(qū)別
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:33
# @Author  : shisuiyi
# @File    : congig_handler.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
import yaml
 
class Config:
    def __init__(self, filename, encoding='utf-8'):
        self.filename = filename
        self.encoding = encoding
        self.suffix = self.filename.split('.')[-1]
        if self.suffix not in ['yaml', 'yml', 'cnf', 'conf', 'ini']:
            raise ValueError('不能識別的配置文件后綴:{}'.format(self.suffix))
 
    def parse_ini(self):
        """
        解析ini
        :return:
        """
        conf = ConfigParser()
        conf.read(self.filename)
        data = {}
        for section in conf.sections():
            data[section] = dict(conf.items(section))
        return data
 
    def parse_yaml(self):
        """
        解析yaml
        :return:
        """
        with open(self.filename, 'r', encoding=self.encoding) as f:
            data = yaml.load(f, Loader=yaml.FullLoader)
        return data
 
    def parse(self):
        """
        解析配置文件
        :return:
        """
        if self.suffix in ['yaml', 'yml']:
            return self.parse_yaml()
        else:
            return self.parse_ini()
 
if __name__ == '__main__':
    cm = Config(r'D:\Lemon\py45\day20\config.yaml')
    res = cm.parse()
    print(res)

4.應(yīng)用到項目中

一個框架封裝的徹不徹底的標準是能否復(fù)用,也即是另外一個項目來用時,不需要修改框架的源碼。

在我們目前封裝的框架中,耦合高的點有:

  • 日志器調(diào)用時的傳參
  • 用例數(shù)據(jù)文件的路徑
  • 生成報告時的傳參

配置文件config.yaml

log:
  name: py45
  filename: 'D:\Lemon\py45\day18\logs\my.log'
  debug: true
test_cases_dir: 'D:\Lemon\py45\day18\testcases'
test_data_file: 'D:\Lemon\py45\day18\testdata\testdata.xlsx'
test_report:
  report_dir: 'D:\Lemon\py45\day18\reports'
  title: 'py45期第一份測試報告'
  desc: '木森老師的測試報告模板'
  tester: 'shisuiyi'

get_config函數(shù)解析后:

{'log': {'name': 'py45',
  'filename': 'D:\\Lemon\\py45\\day18\\logs\\my.log',
  'debug': True},
 'test_cases_dir': 'D:\\Lemon\\py45\\day18\\testcases',
 'test_data_file': 'D:\\Lemon\\py45\\day18\\testdata\\testdata.xlsx',
 'test_report': {'report_dir': 'D:\\Lemon\\py45\\day18\\reports',
  'title': 'py45期第一份測試報告',
  'desc': '木森老師的測試報告模板',
  'tester': 'shisuiyi'}}

我們可以將這些寫到配置文件中,然后在框架代碼中動態(tài)的獲取配置文件的相對應(yīng)設(shè)置,實現(xiàn)代碼的解耦。

common 文件夾下的 __init__.py的文件中調(diào)用解析配置文件的函數(shù)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/13 10:16
# @Author  : shisuiyi
# @File    : __init__.py.py
# @Software: win10 Tensorflow1.13.1 python3.9
from common.log_handler import get_logger
from common.read_excel_tool import get_data_from_excel
from common.congig_handler import get_config
 
conf = get_config(r'D:\Lemon\py45\day19\config.yaml')  # 在這里將配置文件解析成字典格式返回
logger = get_logger(**conf['log'])  # 在這里創(chuàng)建日志器----日志器調(diào)用時的傳參
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/8 21:08
# @Author  : shisuiyi
# @File    : test_login.py
# @Software: win10 Tensorflow1.13.1 python3.9
 
cases = get_data_from_excel(conf['test_data_file'], 'login') # ---測試用例數(shù)據(jù)的路徑
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/9 20:14
# @Author  : shisuiyi
# @File    : main.py
# @Software: win10 Tensorflow1.13.1 python3.9
import unittest
import unittestreport
from common import conf
 
if __name__ == '__main__':
    discover = unittest.defaultTestLoader.discover(conf['test_cases_dir'])  # 表示收集當前目錄下所有用例
    runner = unittestreport.TestRunner(discover, **conf['test_report'])
    runner.run()

總結(jié)

到此這篇關(guān)于python操作配置文件的文章就介紹到這了,更多相關(guān)python操作配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用

    關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用

    本篇文章主要介紹了關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python實現(xiàn)清理微信僵尸粉功能示例【基于itchat模塊】

    Python實現(xiàn)清理微信僵尸粉功能示例【基于itchat模塊】

    這篇文章主要介紹了Python實現(xiàn)清理微信僵尸粉功能,結(jié)合實例形式分析了Python使用itchat模塊刪除微信僵尸粉的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2020-05-05
  • keras.layers.Layer中無法定義name的問題及解決

    keras.layers.Layer中無法定義name的問題及解決

    這篇文章主要介紹了keras.layers.Layer中無法定義name的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python中正反斜杠(‘/’和‘\’)的意義與用法

    Python中正反斜杠(‘/’和‘\’)的意義與用法

    這篇文章主要給大家介紹了關(guān)于Python中正反斜杠(‘/’和‘\’)的意義與使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Python 類中引用其他類的實現(xiàn)示例

    Python 類中引用其他類的實現(xiàn)示例

    在Python中,類的引用是通過屬性或方法與其他類實例關(guān)聯(lián),實現(xiàn)復(fù)雜邏輯,本文介紹了關(guān)聯(lián)、組合等類之間的引用方式,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • python實現(xiàn)合并兩個有序列表的示例代碼

    python實現(xiàn)合并兩個有序列表的示例代碼

    這篇文章主要介紹了python實現(xiàn)合并兩個有序列表的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Python基于pillow庫實現(xiàn)生成圖片水印

    Python基于pillow庫實現(xiàn)生成圖片水印

    這篇文章主要介紹了Python基于pillow庫實現(xiàn)生成圖片水印,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 基于Python編寫微信清理工具的示例代碼

    基于Python編寫微信清理工具的示例代碼

    這篇文章主要和大家分享一個用Python語言編寫的微信清理小工具的示例代碼,而且該工具不會刪除文字的聊天記錄,感興趣的可以了解一下
    2022-05-05
  • 使用Python如何測試InnoDB與MyISAM的讀寫性能

    使用Python如何測試InnoDB與MyISAM的讀寫性能

    網(wǎng)上有很多評論myisam和innodb讀寫性能對比,所以下面這篇文章主要給大家介紹了關(guān)于使用Python如何測試InnoDB與MyISAM讀寫性能的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • python之matplotlib學習繪制動態(tài)更新圖實例代碼

    python之matplotlib學習繪制動態(tài)更新圖實例代碼

    這篇文章主要介紹了python之matplotlib學習繪制動態(tài)更新圖實例代碼,文中涉及具體實現(xiàn)代碼,演示效果及運行時出現(xiàn)的問題分析等相關(guān)內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下
    2018-01-01

最新評論