Python 中 configparser 配置文件的讀寫及封裝,配置文件存放數據,方便修改


1. 將程序中不常變化的數據放在配置文件中,有什么好處?

將配置統一放在一起,進行統一管理,方便維護,方便修改

  • 配置文件將存放測試數據比如:
    • Excel文件名、
    • 日志名、
    • 用例執行的結果、
    • 實際結果和用例執行結果寫入到哪一行、
    • HTML報告的名稱、
    • 報告的標題、
    • 報告的詳細程度、
    • 報告的描述信息、
    • 測試人員的名字、
    • url的地址、
    • 登錄的賬號密碼

2. 結構

  • 配置文件名以 .conf、.ini 為拓展名的文件叫做配置文件
  • 配置文件中使用英文 # ; 進行注釋,等號= 與冒號: 意思一樣
  • 區域名(區分大小寫)
  • 選項名 = 選項值
[file_path]
cases_path = cases.xlsx

 

在創建配置文件后,會出現提示信息

  

 

3. 讀取配置文件基本操作

# 讀取配置文件需要導入一個類:configparser (譯:康飛哥盤思)系統自帶不需要安裝
from configparser import ConfigParser

# 1.創建配置解析器
config = ConfigParser()

# 2.指定讀取的配置文件.read(譯:瑞德):指定讀取的文件名,文件名可以是相對或絕對路徑
config.read("testcase.conf", encoding="utf-8")

# 3.讀取數據-------讀取的是哪個區域下的那個選項名

# 方法一:使用方括號["區域名"]["選項名"]
one_value = config["file path"]["cases_path"]

# 方法二:使用.get("區域名", "選項名") -----推薦使用這個
two_value = config.get("msg", "success_result")

# 從配置文件中,使用方括號或者get讀取的所有值都是字符串類型


# 可以使用 getboolean (譯:給特.堡壘恩)方法獲取 bool 類型的數據
config.getboolean("msg", "va1")

# 可以使用getboolean方法獲取bool類型的數據
# 1、yes、on、true、True ---> 都會讀取為布爾類型True
# 0、no、off、false、False ---> 都會讀取為布爾類型False

# 可以使用 getfloat 方法獲取 float (譯:副樓特)類型的數據
config.getfloat("msg", "value2")

# 可以使用 getint 方法獲取 int 類型的數據
config.getint("msg", "value1")

# 讀取列表
one_list = config.get('msg', 'value7')

# eval 函數能夠將字符串轉換為 python 中的內置類型
# 相當如把字符串的引號(單引號或者雙引號)去掉之后的類型
# 也能夠執行字符串類表達式
one_list = eval(one_list)

# 讀取 配置文件下 某個區域的 所有 key、valu
print(config.items('區域名'))

 

 

4. 寫入配置文件基本操作

  ---不建議對已有文件進行寫入,會覆蓋掉源文件

from configparser import ConfigParser

# 1.創建配置解析器
config = ConfigParser()

# 2.寫入配置的時候,不用使用read(read是讀)
# 構造要寫入的數據,嵌套字典的字典
datas = {
    "file path": {
        "cases_path": "cases1.xlsx",
        "log_path": "record_run_result.txt"
    },
    "msg1": {
        "success_result": "Pass",
        "fail_result": "Fail"
    }
}

# 讀取配置寫入----config['區域名']['選項名']
for key in datas:
    config[key] = datas[key]    # config相當於一個空字典

# 3.保存到文件 a = 追加,w = 寫入
with open("write_config.ini", "w") as file:
    config.write(file)

 

5. 配置文件讀寫數據的封裝,會用到 configparser 庫(譯:康飛哥盤思)

# 封裝配置文件
from configparser import ConfigParser


class HandleConfig:
    """
    配置文件讀寫數據的封裝
    """
    def __init__(self, filename):
        """
        :param filename: 配置文件名
        """
        self.filename = filename
        self.config = ConfigParser()        # 讀取配置文件1.創建配置解析器
        self.config.read(self.filename, encoding="utf-8")   # 讀取配置文件2.指定讀取的配置文件

    # get_value獲取所有的字符串,section區域名, option選項名
    def get_value(self, section, option):
        return self.config.get(section, option)

    # get_int獲取整型,section區域名, option選項名
    def get_int(self, section, option):
        return self.config.getint(section, option)

    # get_float獲取浮點數類型,section區域名, option選項名
    def get_float(self, section, option):
        return self.config.getfloat(section, option)

    # get_boolean(譯:比例恩)獲取布爾類型,section區域名, option選項名
    def get_boolean(self, section, option):
        return self.config.getboolean(section, option)

    # get_eval_data 獲取列表,section區域名, option選項名
    def get_eval_data(self, section, option):
        return eval(self.config.get(section, option))  # get 獲取后為字符串,再用 eval 轉換為列表

    @staticmethod
    def write_config(datas, filename):
        """
        寫入配置操作
        :param datas: 需要傳入寫入的數據
        :param filename: 指定文件名
        :return:
        """
        # 做校驗,為嵌套字典的字典才可以(意思.隱私.談.ce)
        if isinstance(datas, dict):  # 遍歷,在外層判斷是否為字典
            # 再來判斷內層的 values 是否為字典
            for value in datas.values():    # 先取出value
                if not isinstance(value, dict):     # 在判斷
                    return "數據不合法, 應為嵌套字典的字典"

            config = ConfigParser()             # 1.創建配置解析器---與寫入配置操作一致
            for key in datas:                   # 寫入操作
                config[key] = datas[key]     # config 類似於一個空字典
            with open(filename, "w") as file:   # 保存到哪個文件filename=需要指定文件名
                config.write(file)
            # return "寫入成功"


# do_config = HandleConfig('testcase.conf')

if __name__ == '__main__':
    # 讀取操作
    do_config1 = HandleConfig('testcase.conf')       # 讀取那個文件
    res = do_config1.get_value("msg", "success_result")  # 讀取什么內容
    print(res)

    # 寫入操作
    do_config = HandleConfig('write_config.ini')
    datas = {
        "file path": {
            "cases_path": "cases.xlsx",
            "log_path": "record_run_result.txt"
        },
        "msg": {
            "success_result": "Pass",
            "fail_result": "Fail"
        }
    }
    do_config.write_config(datas, "write_config.ini")
    pass

 

補充:以 .ini 結尾的配置文件

想將日志的級別、名字單獨配置,可修改。.ini 、 .yaml

ConfigParser類、 PyYaml模塊

1、實例化

conf = ConfigParser()

2、將文件中的數據讀取

conf.read("配置文件路徑",encoding="utf-8")

3、讀取出來默認是字符串

conf.get(section名字,option名字)

4、支持讀取出來為:bool,int,float

conf.getboolean(section,option)

conf.getint(section,option)

conf.getfloat(section,option)

 

修改操作(了解一下):

1、在已有section下添加/修改 option和value

conf.set(section,option,value)

2、若要新增 section:

conf.add_section(section名字)

3、將1中的變更寫入到配置文件當中。

conf.write(open(文件,“w”,encoding=”utf-8”))

from configparser import ConfigParser

# 1、實例化
conf = ConfigParser()
# 2、將文件中的數據讀取
conf.read("log.ini", encoding="utf-8")

# 3、使用get函數獲取section下的option值
# log必須要有,name也必須存在
value = conf.get("log", "name")
print(value)   # 結果:py43_xj

# 讀取log下的所有key value
print(conf.items("log"))
# 結果:[('name', 'py43_xj'), ('level', 'DEBUG'), ('logfile_name', 'test.log')]

 

補充:以  .yaml 結尾的配置文件

YAML 是一種簡潔的非標記語言。

YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易

基本規則:

1、大小寫敏感

2、使用縮進表示層級關系  -

3、禁止使用 tab 縮進,只能使用空格鍵

4、縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。

5、使用 # 表示注釋

6、字符串可以不用引號標注

 

yaml 讀取后只能是 列表 或字典:只能全部取出來,不能不分數據

1、字典

使用冒號(:)表示鍵值對,同一縮進的所有鍵值對屬於一個map

#Yaml 方式一(注意冒號后的空格)

platformName: Android

platformVersion: 5.1

2、列表

使用連字符(-)表示,注意-后的空格

- hello

- world

3、scalar,純量

字符串、數字、布爾值。不可變數據類型。

 

py讀取yaml文件:

1、第三方庫:pyyaml模塊

2、安裝:pip install pyyaml

3、從yaml文件讀取數據只有3步:

3.0 引入yaml: import yaml

3.1 打開yaml文件: open函數

3.2 調用yaml.load加載文件對象,為python對象。

示例:

# 整個文件都是字典形式
# 字典形式
user: xiaojian
passwd: 11111
port: 3306
host: 127.0.0.1
db_name: nmb_python
# 字典里面嵌套 列表 形式
log:
  - abc
  - 111
  - hello
  - world
# 字典里面嵌套 字典 形式
test:
  key: value
  weekend: happy
  age: 18

===

# 讀取出來是個列表
- 123
- 344
- 234
# 列表里面嵌套 字典
-
  key: value
  hello: 耶耶
# 列表里面嵌套 列表
-
  - 123
  - 345
  - 222
  - 121

 

  ==

 

示例:讀取 yaml 文件

fs = open(yaml文件路徑,encoding="utf-8")

s = yaml.load(fs,yaml.FullLoader)

import yaml
with open("db.yaml",encoding="utf-8") as fs:
    s = yaml.load(fs,yaml.FullLoader)
    print(s)

with open("11.yaml",encoding="utf-8") as fs:
    s = yaml.load(fs,yaml.FullLoader)
    print(s)

# {'user': 'xiaojian', 'passwd': 11111, 'port': 3306, 'host': '127.0.0.1', 'db_name': 'nmb_python', 'log': ['abc', 111, 'hello', 'world'], 'test': {'key': 'value', 'weekend': 'happy', 'age': 18}}
[123, 344, 234, {'key': 'value', 'hello': '耶耶'}, [123, 345, 222, 121]]

 

py讀取yaml文件:

1、第三方庫:pyyaml模塊

2、安裝:pip install pyyaml

3、從yaml文件讀取數據只有3步:

3.0 引入yaml: import yaml

3.1 打開yaml文件: open函數

3.2 調用yaml.load加載文件對象,為python對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM