一、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在实际项目中。
原创文章,作者:GLYWR,如若转载,请注明出处:https://www.506064.com/n/368907.html