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
原文地址:https://www.cnblogs.com/minghong/p/11261138.html