编程中,对于可变内容,最好是将其放入配置文件中,经过这段时间的学习,感觉使用yaml文件很方便。我的环境:win10,python3.8.10。
python使用yaml文件,首先要安装库。
pip38 install pyyaml
安装完毕后,查看一下。
一、编写yaml文件
yaml文件以yml后缀结尾,如alert_ceshi.yml,样式如图:
代码:
text:- 'XXXX'- 'YYYY'resourceId:-
xpath:- '//*[contains(@text,"CCCCCCCCCC")]'pic_name:- ('我的','my.png')- ('你的','you.png')
网上有很多关于yml文件格式的内容,不再赘述。注意一点:yml文件中,每行前面的空格要对齐,而且不能使用TAB键,要使用空格键输入。
二、python读取yml文件
直接上代码:
import yaml#pip38 install pyyaml
from yaml import SafeLoader
from yaml import YAMLErrorCONF_DIR = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(CONF_DIR)
ALERT_YAML_PATH = os.path.join(CONF_DIR, 'alert_ceshi.yml')
print(ALERT_YAML_PATH)def load_yaml(file_path):with open(file_path, encoding='utf-8') as f:try:file = yaml.load(f, Loader=SafeLoader)return fileexcept YAMLError as e:print(e)
接下来的代码,大体有两种需求。
(1)要获取yml文件中所有的value值
(2)要获取yml文件中某个类目(如pic_name)下的value值
针对(1)的代码:
def get_alert_value():alert_data = []data = load_yaml(ALERT_YAML_PATH)#print(data)for value in data.values():#读出所有内容alert_data.extend(list(filter(None, value)))return alert_dataalert_values = get_alert_value()
print(alert_values)#结果如下
#['XXXX', 'YYYY', '//*[contains(@text,"CCCCCCCCCC")]', "('我的','my.png')", "('你的','you.png')"]
针对(2)的代码:
def get_alert_value():data = load_yaml(ALERT_YAML_PATH)print(data)return data.get('pic_name')#只读出某个类目下的内容alert_values = get_alert_value()
print(alert_values)#结果如下
#["('我的','my.png')", "('你的','you.png')"]
当然,也可以把pic_name作为参数传进get_alert_value(参数)中,改进代码:
def get_alert_value(key):data = load_yaml(ALERT_YAML_PATH)print(data)return data.get(key)#只读出某个类目key下的内容alert_values = get_alert_value('pic_name')
print(alert_values)#想读出哪个类目下的内容,直接替换参数即可。
以上就是python读取yaml文件的内容。
下面再记录另一个问题,即读取到pic_name类目下的内容,也就是["('我的','my.png')", "('你的','you.png')"],我的本意是由两个元组构成的列表,但实际上,列表内部其实是两个样式是元组的字符串。
这时,需要使用eval(元素)将其转换类型。而不能使用tuple(元素)。
代码如下:
for alert in alert_values:tuple_alert=eval(alert)#将类字符串的元组,转化成真正的元组print(tuple_alert)print(type(tuple_alert))
结果如下:
#["('我的','my.png')", "('你的','you.png')"]
('我的', 'my.png')
<class 'tuple'>
('你的', 'you.png')
<class 'tuple'>