最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)部,減少風險提高代碼復用。

經(jī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ì)上是一種標記語言,和普通的配置文件相比它能表示更為復雜的數(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下對應的配置項的所有的字符串名稱,以列表返回
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.應用到項目中

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

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

  • 日志器調(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)的獲取配置文件的相對應設(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)文章

  • Python+Pygame實現(xiàn)之走四棋兒游戲的實現(xiàn)

    Python+Pygame實現(xiàn)之走四棋兒游戲的實現(xiàn)

    大家以前應該都聽說過一個游戲:叫做走四棋兒。直接在家里的水泥地上用燒完的炭火灰畫出幾條線,擺上幾顆石頭子即可。當時的火爆程度可謂是達到了一個新的高度。本文將利用Pygame實現(xiàn)這一游戲,需要的可以參考一下
    2022-07-07
  • python3如何去除字符串中的特殊字符

    python3如何去除字符串中的特殊字符

    這篇文章主要介紹了python3如何去除字符串中的特殊字符,在平時處理字符串的時候,經(jīng)常會遇到字符串中夾雜著我們不希望看到的特殊字符,那么如何處理這些特殊字符呢,今天就跟著小編來看看吧
    2023-04-04
  • python3+PyQt5實現(xiàn)文檔打印功能

    python3+PyQt5實現(xiàn)文檔打印功能

    這篇文章主要為大家詳細介紹了python3+PyQt5實現(xiàn)文檔打印功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python Xarray處理設(shè)置二維數(shù)組作為coordinates方式

    python Xarray處理設(shè)置二維數(shù)組作為coordinates方式

    這篇文章主要介紹了python Xarray處理設(shè)置二維數(shù)組作為coordinates方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python dict remove數(shù)組刪除(del,pop)

    python dict remove數(shù)組刪除(del,pop)

    我們在用數(shù)組列表做刪除的時候,可能選擇2個方法,一個是del,一個是pop方法
    2013-03-03
  • 通過Python的speech_recognition庫將音頻文件轉(zhuǎn)為文字

    通過Python的speech_recognition庫將音頻文件轉(zhuǎn)為文字

    recognize_google()?是Google提供的一種語音識別API,可以識別音頻文件或麥克風錄制的語音,并將其轉(zhuǎn)換為文本,這篇文章主要介紹了通過Python的speech_recognition庫將音頻文件轉(zhuǎn)為文字,需要的朋友可以參考下
    2023-05-05
  • Python編程argparse入門淺析

    Python編程argparse入門淺析

    這篇文章主要介紹了Python編程argparse入門淺析,分享了相關(guān)代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 詳解基于python-django框架的支付寶支付案例

    詳解基于python-django框架的支付寶支付案例

    這篇文章主要介紹了基于python-django框架的支付寶支付案例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Python有序字典簡單實現(xiàn)方法示例

    Python有序字典簡單實現(xiàn)方法示例

    這篇文章主要介紹了Python有序字典簡單實現(xiàn)方法,涉及Python使用OrderedDict方法進行字典排序的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python使用kombu連接信息中包含#號問題排查方式

    Python使用kombu連接信息中包含#號問題排查方式

    文章描述了在部署Python項目到生產(chǎn)環(huán)境時遇到的一個錯誤,即端口號無法正確轉(zhuǎn)換為整數(shù)值,該錯誤在測試環(huán)境和本地調(diào)試中沒有出現(xiàn),但在生產(chǎn)環(huán)境中才出現(xiàn),通過分析錯誤信息和代碼,作者發(fā)現(xiàn)問題出在URL解析過程中,特別是在處理包含特殊字符(如#號)的URL時
    2024-12-12

最新評論

台州市| 高尔夫| 五家渠市| 肇州县| 元阳县| 怀宁县| 乐平市| 晋中市| 台湾省| 武夷山市| 墨江| 安化县| 肥乡县| 休宁县| 崇阳县| 东乡族自治县| 阿坝| 洛扎县| 涡阳县| 珠海市| 罗定市| 元阳县| 晴隆县| 南宁市| 乐业县| 林周县| 大名县| 石门县| 平定县| 中西区| 汝南县| 都匀市| 上思县| 昭觉县| 武鸣县| 南投县| 邳州市| 江源县| 麟游县| 集安市| 邯郸市|