美文网首页
python——Yaml

python——Yaml

作者: 小二哥很二 | 来源:发表于2019-07-29 10:27 被阅读0次

    1.安装

    • 需要安装得模块名为pyyaml,直接pip install pyyaml
    • 导入,直接import yaml

    2.yaml文件的格式

    • 文件格式输出可以是列表,可以是字典,可以嵌套。层级关系用空格区分,切记,不支持tab缩进

    a)键值对形式

    user: admin
    pwd: 123
    job:
      - teacher
      - nurese
    输出为:{'user': 'admin', 'pwd': 123, 'job': ['teacher', 'nurese']}
    

    b)序列list

    - admin1: 123456
    - admin2: 111111
    - admin3: 222222
    输出:[{'admin1': 123456},
          {'admin2': 111111}, 
          {'admin3': 222222}]
    

    c)纯量str

    n1: 52.10
    输出:{'n1': 52.1}
    
    n2: true 
    n3: false    #不区分大小写
    输出:{'n2': True, 'n3': False}
    
    None用~表示
    n4: ~
    输出:{'n4': None}
    

    d)强制转换,使用!!

    n7: !!str true
    输出:{'n7': 'true'}
    

    e)多个文件:一个yaml文件里存在多个文件,用---表示,只能一起读取,不能分开读取

    ---
    user: admin
    pwd: ~
    job:
      - teacher
      - nurese
    ---
    school: erxiao
    location: sky
    

    3.yaml文件的读取xx.yaml

    '''多个文件'''
    import yaml
    
    #由于官方提示load方法存在安全漏洞,所以读取文件时会报错。加上warning忽略,就不会显示警告
    yaml.warnings({'YAMLLoadWarning':False}) 
    f=open('source.yaml','r',encoding='utf-8')      #打开yaml文件
    cfg=f.read()
    d=yaml.load_all(cfg)     #将数据转换成python字典行驶输出,存在多个文件时,用load_all,单个的时候load就可以
    for data in d:
        print(data)
    f.close()
    
    输出:
    {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}
    {'school': 'erxiao', 'location': 'sky'}
    
    '''单个文件'''
    yaml.warnings({'YAMLLoadWarning':False})
    f=open('source.yaml','r',encoding='utf-8')
    cfg=f.read()
    print(cfg)
    d=yaml.load(cfg)
    print(d)
    f.close()
    
    输出:
    user: admin
    pwd: ~
    job:
      - teacher
      - nurese
    {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}
    

    4.yaml文件的写入

    import yaml
    import os
    
    def yaml_doc(yampath):
          data={'school':'erxiao',
                'studens':['lili','jj']}
          file=open(yampath,'w',encoding='utf-8')
          yaml.dump(data,file)
          file.close()
    
    currentpath=os.path.abspath('.')     #获取当前路径
    yamlpath=os.path.join(currentpath,'generate.yaml')    #创建yaml文件
    yaml_doc(yamlpath)
    输出:
    generate.yaml文件
    school: erxiao
    studens:
      - lili
      - jj
    ```※注意:如果是在已存在数据的yaml文件中执行此脚本,那么数据会被覆盖※```
    

    5.yaml文件的持续写入

    import yaml
    
    inputdata={
        "url":'https://www.baidu.com/',
        "driver":['ie','chrome','firfox']
    }
    with open('source.yaml','a',encoding='utf-8') as f:      #'a'代表持续写入,‘w’代表覆盖写入
        yaml.dump(inputdata,f)
    print('well done')
    

    6.Template修改yaml中的变量
    source.yaml

    - test:
        name: login case1
        request:
            url: http://49.235.x.x:7000/api/v1/login/
            method: POST
            headers:
                Content-Type: application/json
                User-Agent: python-requests/2.18.4
            json:
                username: $user
                password: $psw
        validate:
            - eq: [$.msg, login success!]
            - eq: [$.code, 0]
    
    

    Read_yaml.py

    import yaml
    from string import Template
    class YamlUtil:
        def __init__(self, yaml_file):
            self.yaml_file = yaml_file
    
        def read_yaml(self):
            with open(self.yaml_file, 'r', encoding='utf-8') as f:
                # 正常格式控制台输出
                # value = yaml.load(f, Loader=yaml.FullLoader)
                # 原格式输出
                value = f.read()
    
                temp = Template(value)
                # substitute替代者
                # safe_substitute可以让不想匹配的变量当正常的字符串使用
                res = temp.safe_substitute({'user': 'lily', 'password': '123456'})
                yaml_data = yaml.safe_load(res)
                print(res)
                print(yaml_data)
    
    
    if __name__ == '__main__':
        YamlUtil('source.yaml').read_yaml()
    

    问题:1.含有多个文件的yaml文件,读取出来如何选择?
    2.持续写入能否将新写入的文件变成新的文件结构?

    PS:觉得这篇文章有用的朋友,多多点赞打赏哦~!

    相关文章

      网友评论

          本文标题:python——Yaml

          本文链接:https://www.haomeiwen.com/subject/larvrctx.html