我们经常会用到ini或者yaml配置文件,下面学习下如何解析此类文件

1、解析ini文件

使用configparser模块,python自带的不需要安装
一个ini文件是由多个section组成,每个section中以key=vlaue形式存储数据;

1.1、ini文件的定义

  1. ini 文件的写法通俗易懂,通常由**节**(Section)、**键**(key)和**值**(value)组成,就像以下形式:
  1. [mysql] # section
  2. port=3306
  3. host=127.0.0.1
  4. user=root
  5. password=123456
  6. [redis]
  7. port=6378
  8. host=127.0.0.1
  9. password=123456
  10. db=0
  • [mysql]: (Section)
  • host: (key)
  • 127.0.0.1: (value)
  1. import configparser
  2. import os
  3. config = configparser.ConfigParser() #实例化
  4. base_path = os.path.dirname(os.path.abspath(__file__)) # 从一个路径中提取文件路径
  5. file_path = os.path.join(base_path, "test.ini") # 存放ini配置文件的路径
  6. config.read(file_path)
  7. section = config.sections()
  8. print(section)

获取配置文件中的所有section
[‘mysql’, ‘redis’]

1.1.1、读取节点下一个key对应的value值

  1. import configparser
  2. import os
  3. config = configparser.ConfigParser() #实例化
  4. base_path = os.path.dirname(os.path.abspath(__file__)) # 从一个路径中提取文件路径
  5. file_path = os.path.join(base_path, "test.ini") # 存放ini配置文件的路径
  6. config.read(file_path)
  7. # result1 = config['mysql']['host']
  8. result1 = config.get("mysql","host")

结果:
127.0.0.1

1.1.2、读取某个节点下的所有value值

  1. import configparser
  2. import os
  3. config = configparser.ConfigParser() #实例化
  4. base_path = os.path.dirname(os.path.abspath(__file__)) # 从一个路径中提取文件路径
  5. file_path = os.path.join(base_path, "test.ini") # 存放ini配置文件的路径
  6. config.read(file_path)
  7. #
  8. result1 = config.items('mysql')
  9. print(result1)
  10. print(dict(result1))

结果如下:
image.png

  1. import configparser
  2. import os
  3. config = configparser.ConfigParser() #实例化
  4. base_path = os.path.dirname(os.path.abspath(__file__)) # 从一个路径中提取文件路径
  5. file_path = os.path.join(base_path, "test.ini") # 存放ini配置文件的路径
  6. config.read(file_path)
  7. result1 = config['mysql']
  8. print(result1)
  9. print(dict(result1))

image.png

1.1.3、获取所有节下的键值对

  1. for section in config.sections(): #获取所有节下的键值对
  2. print(dict(config[section]))

image.png

2、解析yaml文件


yaml是比较常见的一种配置文件,解析它需要安装pyyaml模块

  1. pip install pyyaml


2.1、yaml文件定义

  1. #config.yaml
  2. port: 3306
  3. host: 127.0.0.1
  4. username: sdfsfdf
  5. password: xxxx
  6. users:
  7. - xiaohei
  8. - xiaobai
  9. - xiaolan
  10. mysql:
  11. port: 3306
  12. host: 192.168.1.123
  13. user: root
  1. import yaml
  2. import os
  3. #下面是解析
  4. with open("config.yaml", encoding="utf-8") as fr:
  5. result = yaml.load(fr, yaml.SafeLoader)
  6. print(result)


image.png

2.2、把字典写入yaml文件里

  1. d = {'url': 'http://127.0.0.1:1111/login', 'method': 'get', 'headers': {'token': 'xxx'},
  2. 'data': {'name': 'abc', 'password': 'xxx'}}
  3. with open("config2.yaml", 'w', encoding="utf-8") as fr:
  4. yaml.dump(d, fr)

image.png

3、读配置文件封装

  1. class ConfigReader:
  2. def __init__(self, file):
  3. self.file = file
  4. self.check_file()
  5. def check_file(self):
  6. if not os.path.isfile(self.file):
  7. raise Exception(f"解析{self.file}出错!请检查文件!")
  8. def get_ini_config(self, node="all"):
  9. config = configparser.ConfigParser()
  10. config.read(self.file)
  11. if node == "all":
  12. config_dict = {}
  13. for node in config.sections():
  14. config_dict[node] = dict(config[node])
  15. return config_dict
  16. if node not in config.sections():
  17. return {}
  18. return dict(config[node])
  19. def get_yaml_config(self, node="all"):
  20. with open(self.file, encoding="utf-8") as fr:
  21. result = yaml.load(fr, yaml.SafeLoader)
  22. if node == "all":
  23. return result
  24. return result.get(node)
  25. if __name__ == '__main__':
  26. result = ConfigReader("config.yaml").get_yaml_config()
  27. print(result)
  28. # result = ConfigReader("test.ini").get_ini_config()
  29. # print(result)

参考文件:https://www.yuque.com/nnzhp/nkqyhm/waxv40