yaml

作者: wit92 | 来源:发表于2020-06-14 17:38 被阅读0次
1、load() :返回一个对象

我们先创建一个yml文件,config.yml:

name:name: Tom Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
 - name: Jimmy Smith
   age: 15
 - name1: Jenny Smith
   age1: 12 Tom Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
 - name: Jimmy Smith
   age: 15
 - name1: Jenny Smith
   age1: 12

读取yml文件:

import yaml
f = open(r'/home/l/PycharmProjects/test_modules/config.yml')
y = yaml.load(f)
print (y)

运行结果:

{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}

语法详细讲解

yaml.load(input, Loader=yaml.FullLoader)

目前的Loader选择是:

  • BaseLoader

    仅加载最基本的YAML

  • SafeLoader

    安全地加载YAML语言的子集。建议用于加载不受信任的输入。

  • FullLoader

    加载完整的YAML语言。避免任意代码执行。这是当前(PyYAML 5.1)默认加载器调用yaml.load(input)(发出警告后)。

  • UnsafeLoader(也称为Loader向后兼容性)

    原始的Loader代码,可以通过不受信任的数据输入轻松利用。

您也可以使用其中一种快捷方式“糖”方法:

  • yaml.safe_load
  • yaml.full_load
  • yaml.unsafe_load

如果您是使用触发此警告的第三方模块的软件的作者/维护者,请首先确保它们的使用对您的应用程序是安全的。确保他们知道警告。然后,您可以“全局”禁用警告:

yaml.warnings({'YAMLLoadWarning': False})

脚注

此页面将及时更新,其中包含有关load()弃用,使用和警告的最新信息。

2、load_all()生成一个迭代器

如果string或文件包含几块yaml文档,你可以使用yaml.load_all来解析全部的文档。

import yaml
f = '''
---
name: James
age: 20
---
name: Lily
age: 19
'''
y = yaml.load_all(f)
for data in y:
    print(data)

运行结果:

{'name': 'James', 'age': 20}
{'name': 'Lily', 'age': 19}
3、yaml.dump 将一个python对象生成为yaml文档
import yaml
aproject = {'name': 'Silenthand Olleander',
            'race': 'Human',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }

print(yaml.dump(aproject,))

运行结果:

name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]

yaml.dump接收的第二个参数一定要是一个打开的文本文件或二进制文件,yaml.dump会把生成的yaml文档写到文件里

import yaml

aproject = {'name': 'Silenthand Olleander',
            'race': 'Human',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }
f = open(r'/home/l/PycharmProjects/test_modules/config.yml', 'w')
print(yaml.dump(aproject, f))

运行结果:

None

生成了config.yml文件,文件内容

name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]
4、yaml.dump_all()将多个段输出到一个文件中
import yaml

obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19]

with open(r'/home/l/PycharmProjects/test_modules/config.yml', 'w') as f:
    yaml.dump_all([obj1, obj2], f)

运行结果:

{age: 20, name: James}
--- [Lily, 19]

二、yaml语法

1、基本规则
 1. 大小写敏感
 2. 使用缩进表示层级关系
 3. 缩进时不允许使用Tab,只允许使用空格
 4. 缩进的空格数目不重要,只要相同层级的元素左对齐即可
 5. # 表示注释,从它开始到行尾都被忽略
2、yaml转字典

yaml中支持映射或字典的表示,如下:

# 下面格式读到Python里会是个dict
name: 灰蓝
age: 0
job: Tester

输出:

{'name': '灰蓝', 'age': 0, 'job': 'Tester'}
3、yaml转列表

yaml中支持列表或数组的表示,如下:

# 下面格式读到Python里会是个list
- 灰蓝
- 0
- Tester

输出:

['灰蓝', 0, 'Tester']
4、复合结构:

字典和列表可以复合起来使用,如下:

# 下面格式读到Python里是个list里包含dict
- name: 灰蓝
  age: 0
  job: Tester
- name: James
  age: 30

输出:

[{'name': '灰蓝', 'age': 0, 'job': 'Tester'}, {'name': 'James', 'age': 30}]
5、基本类型:
字符串
整型
浮点型
布尔型
null
时间
日期

我们写个例子来看下:

# 这个例子输出一个字典,其中value包括所有基本类型
str: "Hello World!"
int: 110
float: 3.141
boolean: true  # or false
None: null  # 也可以用 ~ 号来表示 null
time: 2016-09-22t11:43:30.20+08:00  # ISO8601,写法百度
date: 2016-09-22  # 同样ISO8601

输出:

{'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000), 'date': datetime.date(2016, 9, 22)}

如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了

str: 灰蓝
str1: "Hello World"
str2: "Hello\nWorld"

输出:

{'str': '灰蓝', 'str1': 'Hello World', 'str2': 'Hello\nWorld'}

里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符;如

str1: 'Hello\nWorld'
str2: "Hello\nWorld"

输出:

{'str1': 'Hello\\nWorld', 'str2': 'Hello\nWorld'}

可以看到,单引号中的’\n’最后是输出了,双引号中的’\n’最后是转义成了回车

6、强制转换

yaml是可以进行强制转换的,用 !! 实现,如下:

str: !!str 3.14
int: !!int "123"

输出:

{'int': 123, 'str': '3.14'}

1明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型。

7、分段

在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中

---
name: James
age: 20
---
name: Lily
age: 19
8、 引用

& 和 * 用于引用

name: &name 灰蓝
tester: *name

这个相当于一下脚本:

name: 灰蓝
tester: 灰蓝

输出:

{'name': '灰蓝', 'tester': '灰蓝'}

相关文章

网友评论

    本文标题:yaml

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