目录
yaml的简介
- yaml文件是docker和Kubernetes(k8s) 的配置文件默认格式。
- yaml是一个可读性高,用来表达数据序列化的格式
- yaml是:YAML Ain`t Markuo Language(YAML不是一种标记语言)的递归缩写
- yaml可以转换成JSON YML的格式
- yaml文件 的格式是:文件名.yaml
yanl的语法格式
- 使用缩进表示层级关系
- 缩进的宫格数量不重要,只要相同层级的元素左对齐就可以
- # 可以写注释
- yaml文件大小写敏感
yaml文件的基本数据类型
纯量
纯量是基本的不可再分的值:字符串,布尔值,整数,浮点数,NULL,时间,日期
列表格式:
namelist:
张三
李四
王五
字典格式
name: 张三
word: 我是世界之王
age: 18
日期格式:
# 日期格式 符合ISO 8601
date: 2023-09-20
# 时间格式 在日期之后加大写T加时间+时区
time: 2023-09-20T20:30:10+08:00
使用长字符串中的问题:
如何加入换行,如何取消换行,如何只要一个换行
# 在一个长的字符串中使用大于号来表示这是一个长的字符串。
singleLinestring1: >
this is a very long string
another line
another line
使用python对该字符串读取
获得的结果
去除长字符串中的\n
这时候我发现在字符串结尾有一个\n的语法。这不符合我的预期。于是发现还有一种写法:
# 加入>-符号 会将\n符号去除
singleLinestring1: >-
this is a very long string
another line
another line
结果:
给没一行结尾添加\n
另外一种情况:我想要在每一行结束加入一个换行符,怎么操作:
# 使用| 这个符号来标记获得每行结束加入一个换行符
singleLinestring1: |
this is a very long string
another line
another line
结果如下
数组
数组的写法
namelist:
- 张三
- 李四
- 王五
namelist2: [张三, 李四, 王五]
获得的值
对象
对象的写法:
herolist:
hero1:
- name: 盖伦
word: 德玛西亚万岁
r: 大保健
hero2:
- name: 嘉文
word: 为了德玛西亚
r:
- cd: 30
now: 19
yaml的使用
open()
open()打开文件需要关闭
import yaml # 导入yaml的包
f = open("testyaml2.yaml", "r", encoding="utf-8")
data = yaml.safe_load(f)
print(data)
f.close()
with open()
with open() 不需要特意关闭
import yaml # 导入yaml的包
# 使用with open()as f: 方式打开文件,方法自带关闭文件功能。
# open的参数:第一个为打开的文件名,第二个是参数格式 第三个为编码格式
with open("testyaml2.yaml", "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
print(data)
打开文件的参数
下面我们上述读写操作进行几点补充说明:
针对读r(read)类型,都要求操作文件必须已存在;
'r+' 表示可读可写(可读取,可写入),写入时,将追加在文件内容结尾。
‘a’表示追加写。只能执行写(追加在后面),不能读。
‘a+’表示追加读写。打开文件方式与写入方式和'a'一样,但是可以读。需要注意的是,如果是若刚用‘a+’打开一个文件,一般不能直接读取。
常用文件操作方式
print(f.readline())#打印第一行
print(f.readline(6))#打印前6个字符
print(f.readlines())#一次读取所有内容并按行返回list
print(f.tell())#打印当前指针位置
print(f.read())#一次性读取文件的全部内容,读完后,指针停留在结尾处。(文件较小时可以使用,当文件较大时,建议使用read(size)方法,该方法每次最多读取size个字节的内容)
print(f.seek( 0))# seek(0)表示将指针返回到文件头;文件如果要重头到尾再读,文件指针须先回到文件头(0-文件头,默认值;1-当前位置;2-文件尾)
print(f.read())#重读文件
print(f.encoding)#打印当前使用的字符编码
print(f.name)#打印文件名
print(f.flush())#刷新
f.truncate()#清空文件
f.truncate(12)#从头开始,第12个字符后截断并清除
f.close()#关闭文件
锚点
使用&+变量名来定义变量,使用*+变量名使用变量
dev:
driveClaasName: &drive com.mysql
type: &type com.alibaba
userName: &userName root
# 在yaml中,重复的引用可以用&+变量名定义为参数 在引用时使用*+变量名即可
test:
driveClaasName: *drive
type: *type
userName: *userName
这是获得的结果
引用
使用&+变量名在列表之外增加锚点
commd: &commd
driveClaasName: &drive com.mysql
type: &type com.alibaba
test:
driveClaasName: *commd
userName: root
dev:
driveClaasName: com.mysql
userName: root
结果
结论:
发现多了一格drivaClaasName的字段。
解决多字段的方法:
commd: &commd
driveClaasName: &drive com.mysql
type: &type com.alibaba
dev:
<<: *commd
userName: root
这样就解决了多字段的问题。
说明:
<<: *commd 作用是,告诉yaml,这个引用是将引用的参数拼接到这个位置。