安装: 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