zoukankan      html  css  js  c++  java
  • ymal

    安装: pip install pyymal
    在学习python如何操作yml文件之前,我们先科普一下yml的格式
    yaml是专门写配置文件的语言,非常简洁和强大,比json更加方便
    YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
    它的基本语法规则如下:
      1,大小写敏感
      2,使用缩进表示层级关系
      3,缩进时不允许使用tab键,只允许使用空格
      4,缩进的空格数目不重要,只要相同层级的元素左对齐即可
    # 表示注释,从这个符号开始, 一直到行尾,都会被解释器忽略
    yaml支持的数据结构 有三种:
      1,对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
      2,数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
      3,纯量(scalars):单个的、不可再分的值
    以下分别介绍这三种数据结构
    一,对象
      对象的一组键值对,使用冒号结构表示
      animal:pets
      Yaml 也允许另一种写法,将所有键值对写成一个行内对象
      hash:{name:Steve,foo:bar}
    二,数组
      一组连词线开头的行,构成一个数组
      - cat
      - Dog
      数据结构的子成员是一个数组,则可以在该项下面缩进一个空格:
      -
              - cat
         - Dog
      数组也可以采用行内表示法:
      animal:[cat,Dog]
    三,复合结构
      对象和数组可以结合使用,形成复合结构:
      languages:
        - Ruby
        - Perl
             - Python
      websites:
        YAML:yaml.org
        Ruby:ruby-lang.org
        Python:python.org
        Perl:use.perl.org
    四,纯量
      纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量:
      1,字符串
      2,布尔型
      3,整数
      4,浮点型
      5,null
      6,时间
      7,日期
      数值直接以字面量的形式表示:
        number:12.30
      布尔值用true和false表示:
        isSet:True
      null用~表示:
        parent:~
      时间采用 ISO8601 格式:
        iso8601:2001-12-14t21:59:43.10-05:00
      日期采用复合 iso8601 格式的年、月、日表示:
        date:2018-01-01
      YAML 允许使用两个感叹号,强制转换数据类型:
        e: !!str 123
        f: !!str Ture
    五,字符串
      字符串是最常见的,也是最复杂的一种数据类型
      字符串默认不适用引号表示
      str:这是一行字符串
      如果字符串包含空格,特殊符号等,需要放到引号内
      str:'内容:字符串'
      单引号和双引号都可以用,双引号不会对特殊字符转义
      s1:'内容
    字符串'
      s2:“内容
    字符串”
      单引号之中如果还有单引号,必须连续使用两个单引号转义
      str:'labor''s day'
      字符串可以写成多行,从第二行开始,必须有一个单空格缩进,换行符会被转成空格
      str:这是一段
        多行
        字符串
      多行字符串可以使用|保留换行符,也可以使用>折叠换行
      this: |
        foo
        bar
      that: >
        foo
        bar
      +表示保留文字块末尾的换行,-表示删除文字块末尾的换行
      s1: |
        foo
      s2: |+
        foo
      s3: |-
        foo
      字符串内可以插入HTML标记
      message: |
        <p style='color:red'>
          段落
        /p>
    六,引用
      锚点&和别名*,可以用来引用
      defaults: &defaults
         adapter: postgres
         host:   localhost
      development:
        database:myapp_development
        <<:*defaults
      test:
        database:myapp_test
        <<:*defaults
      等同于下面的代码:
      defaults:
        adapter:postgres
        host:localhost
      development:
        database:myapp_development
        adapter:postgres
        host:localhost
      test:
        database:myapp_test
        adapter:postgres
        host:localhost
     
    ----------------------------------下面看完整的列子----------------------------------------
    #这是一个ymal
    name: Tom Smith
    
    age: 37
    
    spouse:
    
        name: Jane Smith
    
        age: 25
    
    children:
    
      - name: Jimmy Smith
    
        age: 25
    
      - name1: Jenny Smith
    
        age1: 12
    
    
    #这是读取yaml的py代码,用load方法
    import yaml
    
    f = open('test.yaml')
    
    y = yaml.load(f)
    
    print(y)
    
    #这是结果:{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 25}, {'name1': 'Jenny Smith', 'age1': 12}]}
    
    
    --------------------自动生成yaml文件--------------------用dump方法
    import yaml
    
    
    d = [{'tasks': [{'yum': {'state': 'latest', 'name': 'httpd'}, 'name': 'ensure apache is at the latest version'}, {'name': 'write the apache config file', 'template': {'dest': '/etc/httpd.conf', 'src': '/srv/httpd.j2'}, 'notify': ['restart apache']}, {'name': 'ensure apache is running', 'service': {'state': 'started', 'name': 'httpd'}}], 'hosts': 'webservers', 'remote_user': 'root', 'vars': {'http_port': 80, 'max_clients': 200}, 'handlers': [{'name': 'restart apache', 'service': {'state': 'restarted', 'name': 'httpd'}}]}]
    
    
    with open("./test.yaml","w") as f:
    
        yaml.dump(d,f)
    
    
    #生成的结果文件
    - handlers:
    
      - name: restart apache
    
        service: {name: httpd, state: restarted}
    
      hosts: webservers
    
      remote_user: root
    
      tasks:
    
      - name: ensure apache is at the latest version
    
        yum: {name: httpd, state: latest}
    
      - name: write the apache config file
    
        notify: [restart apache]
    
        template: {dest: /etc/httpd.conf, src: /srv/httpd.j2}
    
      - name: ensure apache is running
    
        service: {name: httpd, state: started}
    
      vars: {http_port: 80, max_clients: 200}
    
    
    class YamlReader:
    
      def __init__(self, yamlfilepath):
    
        if os.path.exists(yamlfilepath):
    
          self.yamlfilepath = yamlfilepath
    
        else:
    
          raise FileNotFoundError('文件不存在!')
    
      self._data = None
    
     @property
    
     def data(self):
    
    # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据
    
      if not self._data:
    
        with open(self.yamlfilepath, 'rb') as f:
    
          self._data = list(yaml.safe_load_all(f))  # load后是个generator,用list组织成列表
    
      return self._data
  • 相关阅读:
    tigerVNC远程桌面,跨内网
    Nutch 二次开发之parse正文内容
    在一个字符串中找到第一个仅仅出现一次的字符。
    图像处理之霍夫变换(直线检測算法)
    EJB3.0开发环境的搭建
    uestc 250 数位dp(水)
    Matlab画图-非常具体,非常全面
    高性能I/O设计模式Reactor和Proactor
    leetcode第一刷_Path Sum II
    PreTranslateMessage作用和用法
  • 原文地址:https://www.cnblogs.com/minghong/p/11261138.html
Copyright © 2011-2022 走看看