編程中,對于可變內容,最好是將其放入配置文件中,經過這段時間的學習,感覺使用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'>
?
?
?
?