python使用yaml文件以及元组样式字符串使用eval的类型转换

编程中,对于可变内容,最好是将其放入配置文件中,经过这段时间的学习,感觉使用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 YAMLError

CONF_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 file
        except 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_data

alert_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'>

 

 

 

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值