一、yaml介绍
YAML全称为"YAML Ain't Markup Language", 是一种可读性高、用于表达数据序列化的格式,常用于配置文件、数据交换格式等场景。YAML文件的扩展名为.yml或.yaml,支持多种语言的解析,包括Python。相较于XML和JSON格式的文件,YAML文件更简洁、易读、易写。Python中的yaml模块,可以轻松地将Python中的数据结构转化为YAML格式。
二、python3yaml基本使用
Python中的yaml模块提供了基本的dump、dumps、load、loads函数来实现YAML与Python对象的相互转换。
1. Python对象转YAML
import yaml
# Python对象
data = {
'name': 'Jack',
'age': 30,
'hobbies': ['reading', 'sports'],
'contacts': {
'email': 'jack@example.com',
'phone': 123456789
}
}
# 将Python对象转换为YAML格式
yaml_data = yaml.dump(data)
print(yaml_data)
运行以上代码,将会输出以下结果:
age: 30
contacts:
email: jack@example.com
phone: 123456789
hobbies:
- reading
- sports
name: Jack
可以发现,Python数据结构被转化成了YAML格式,对于Python中复杂的嵌套数据结构也同样可被转换为相应的YAML格式。
2. YAML转Python对象
import yaml
# YAML格式的数据
yaml_data = '''
name: Jack
age: 30
hobbies:
- reading
- sports
contacts:
email: jack@example.com
phone: 123456789
'''
# 将YAML格式数据转换为Python对象
data = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(data)
运行以上代码,将会输出以下结果:
{'name': 'Jack', 'age': 30, 'hobbies': ['reading', 'sports'], 'contacts': {'email': 'jack@example.com', 'phone': 123456789}}
通过load函数,将YAML格式的数据转换为Python对象,转化后结果为Python中的一个字典对象。
三、yaml属性设置
除了基本的dump、dumps、load、loads函数,yaml模块还提供了许多属性设置,来控制YAML的转换过程。
1. 指定样式
可以通过默认设置和配置样式来指定转化后的YAML样式。比如对于默认情况下Python列表类型被转换为YAML列表(使用“-”符号),也可以指定其转换成块或流样式,即用中括号或无中括号的方式。
import yaml
# Python对象
data = {
'name': 'Jack',
'age': 30,
'hobbies': ['reading', 'sports', 'travel'],
'contacts': {
'email': 'jack@example.com',
'phone': 123456789
}
}
# flow样式
yaml_data1 = yaml.dump(data, default_flow_style=True)
print(yaml_data1)
# block样式
yaml_data2 = yaml.dump(data, default_flow_style=False)
print(yaml_data2)
运行以上代码,将会输出以下结果:
{age: 30, contacts: {email: jack@example.com, phone: 123456789}, hobbies: [reading, sports, travel], name: Jack}
age: 30
contacts:
email: jack@example.com
phone: 123456789
hobbies:
- reading
- sports
- travel
name: Jack
如果指定了flow样式,则每个元素在同一行上展示;如果指定了block样式,则每个元素单独占一行。
2. 控制缩进
如果希望输出具有更好可读性的YAML,可以通过设置缩进属性进行设置。
import yaml
# Python对象
data = {
'name': 'Jack',
'age': 30,
'hobbies': ['reading', 'sports'],
'contacts': {
'email': 'jack@example.com',
'phone': 123456789
}
}
# 缩进为4
yaml_data1 = yaml.dump(data, default_flow_style=False, indent=4)
print(yaml_data1)
# 缩进为2
yaml_data2 = yaml.dump(data, default_flow_style=False, indent=2)
print(yaml_data2)
运行以上代码,将会输出以下结果:
age: 30
contacts:
email: jack@example.com
phone: 123456789
hobbies:
- reading
- sports
name: Jack
age: 30
contacts:
email: jack@example.com
phone: 123456789
hobbies:
- reading
- sports
name: Jack
可以发现,通过设置indent属性可以控制YAML文件的缩进。值得注意的是,缩进属性的值是一个整数,而不是将YAML文件中的空格数量作为值。
3. 设置标签
可以为Python对象指定标签,这些标签可以作为对象构造函数的参数传递。
import yaml
# 自定义数据类型
class MyData:
def __init__(self, val):
self.value = val
def __repr__(self):
return 'MyData(%d)' % self.value
# Python对象
data = {
'name': 'Jack',
'age': 30,
'value': MyData(100)
}
# 定义标签
yaml.add_representer(MyData, lambda dumper, data: dumper.represent_scalar('!MyData', str(data.value)))
# 将Python对象转换为YAML格式
yaml_data = yaml.dump(data)
print(yaml_data)
# 将YAML格式数据转换为Python对象
loaded_data = yaml.load(yaml_data, Loader=yaml.FullLoader)
print(loaded_data)
运行以上代码,将会输出以下结果:
age: 30
name: Jack
value: !MyData 100
{'name': 'Jack', 'age': 30, 'value': MyData(100)}
在以上示例中,我们使用add_representer函数定义了一个自定义类型的标签,并将其作为输出的结果。
四、yaml高级应用
以上我们已经介绍了基本的python3yaml使用方法和一些常见的属性设置。接下来,我们来了解一些yaml更高级的应用场景,包括yaml文件的拆分、引用类型、注释等。
1. yaml文件的拆分
在大型项目中,yaml文件通常会非常庞大,如果整个文件都写在一个文件中,可读性会变差。解决这个问题的一种方法是将文件拆分成多个小的yaml文件。 在将yaml文件拆分成多个小文件时,可能会存在重复的定义或属性。为了解决这个问题,可以使用anchor(锚点)和alias(别名)属性。 使用锚点,可以将同一个属性定义为多个锚点并进行重用。使用别名,可以将重复使用的锚点取一个别名,并在其他地方引用它。yaml模块实现了锚点和别名相关的函数,可以通过这些函数来实现yaml文件的拆分和重用。
2. 引用类型
引用类型是指“&name”和“*name”形式的语法,用于实现yaml文件中的跨位置引用。当一个锚点被定义时,可以通过在其他位置使用“*name”来引用它。
import yaml
# Python对象
data = {
'name': 'Jack',
'age': 30,
'emails': ['jack@example.com', 'jack@company.com'],
'contacts': {
'email': 'jack@example.com',
'phone': 123456789
}
}
# 定义锚点
yaml_str = '''
name: &name Jack
age: 30
emails: &emails
- jack@example.com
- jack@company.com
contacts:
email: *emails
phone: 123456789
'''
# 将YAML格式数据转换为Python对象
loaded_data = yaml.load(yaml_str, Loader=yaml.FullLoader)
print(loaded_data)
以上程序段演示的是在yaml文件中引用锚点和别名的过程及转换结果。
3. 注释
注释是指在yaml文件中对数据或配置项的解释或说明,以帮助其他人更好地了解文件的内容。在yaml文件中,注释以#字符开始。
import yaml
# 自定义数据类型
class MyData:
def __init__(self, val):
self.value = val
def __repr__(self):
return 'MyData(%d)' % self.value
# Python对象
data = {
# 用户名
'name': 'Jack',
# 年龄
'age': 30,
# 爱好
'hobbies': ['reading', 'sports', 'travel'],
# 联系方式
'contacts': {
# 邮箱
'email': 'jack@example.com',
# 电话
'phone': 123456789
},
# 自定义类型
'value': MyData(100)
}
# 定义标签
yaml.add_representer(MyData, lambda dumper, data: dumper.represent_scalar('!MyData', str(data.value)))
# 将Python对象转换为YAML格式
yaml_data = yaml.dump(data)
print(yaml_data)
以上程序段演示了如何在yaml文件中使用注释对数据或配置项的解释或说明。
五、总结
本文详细介绍了Python3yaml的基本使用方法及一些高级应用场景,包括yaml文件的拆分、引用类型、注释等。通过学习本文内容,读者可以更好地了解yaml格式的概念、使用方法和一些注意事项,从而更好地应用yaml在实际项目中。