Python解析YAML: PyYAML详解

PyYAML是一个Python库,用于解析和生成YAML数据,支持YAML 1.1规范。它包括安全加载、自定义类型、锚点引用等功能。PyYAML提供了解析器、表示器和构造器组件,允许自定义类型注册和处理。此外,还介绍了YAML的标量、序列、映射,以及如何处理环境变量和集成LibYAML以提高性能。扩展库ruamel.yaml提供了更多高级功能和兼容性。
摘要由CSDN通过智能技术生成

一、PyYAML介绍

以下介绍为chatgpt生成。

PyYAML 是一个用于解析和生成 YAML 数据的 Python 库。它提供了简单易用的接口,用于读取和写入 YAML 格式的文件、字符串或流。

以下是一些关于 PyYAML 的重要特点和功能:

  1. 解析和生成:PyYAML 支持将 YAML 数据解析为 Python 对象,并且可以将 Python 对象转换为 YAML 格式。
  2. 支持标准:PyYAML 实现了 YAML 1.1 规范,兼容大多数 YAML 实现。它支持常见的 YAML 特性,如标量、映射、序列、锚点引用等。
  3. 安全加载:PyYAML 提供了 SafeLoader,它是一个相对较安全的加载器,用于加载 YAML 数据时限制执行的操作,以降低潜在的安全风险。
  4. 高级加载器:除了 SafeLoader,PyYAML 还提供了 Loader,它是一个更灵活的加载器,支持加载自定义类型和构造函数。
  5. 写入和流:PyYAML 可以将 Python 对象转换为 YAML 格式的字符串,并且可以将 YAML 数据流写入文件或流。
  6. 自定义类型:PyYAML 允许注册和使用自定义类型和构造函数,以支持特定的对象序列化和反序列化需求。
  7. 扩展性:PyYAML 提供了灵活的 API,允许你根据需要进行自定义扩展,例如添加标签处理程序、构造函数和序列化器等。

使用 PyYAML,你可以轻松地在 Python 中处理 YAML 数据,无论是读取和解析现有的 YAML 文件,还是将数据转换为 YAML 格式并进行写入。这使得 PyYAML 成为处理配置文件、数据交换、持久化存储等场景中的有用工具。

以下是一个简单示例,展示了如何使用 PyYAML 加载和保存 YAML 文件:

import yaml

# 加载 YAML 文件
with open('config.yaml', 'r') as file:
    config = yaml.safe_load(file)

# 修改配置数据
config['database']['host'] = 'localhost'
config['database']['port'] = 3306

# 保存配置到 YAML 文件
with open('config.yaml', 'w') as file:
    yaml.dump(config, file)

在上述示例中,我们首先使用 safe_load 函数加载 YAML 文件。然后,我们对配置数据进行修改,并使用 dump 函数将修改后的数据保存回 YAML 文件。

总的来说,PyYAML 提供了一种简单和方便的方式来处理 YAML 数据,并与 Python 的数据类型和对象进行交互。

二、YAML 标量、映射、序列

在YAML中,有3种基本的数据结构:Scalars(标量)、Sequences(序列)和Mappings(映射)。它们用于构建和表示复杂的数据。

标量(Scalars)

标量是单个的、不可再分的值。标量可以是字符串、数字、布尔值、null、日期等。下面是一些标量数据类型的例子:

boolean: 
    - TRUE  #true, True都可以
    - FALSE  #false, False都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二进制表示
null: ~  #使用~或者null表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行, 每一行会被转化成一个空格
date:
    - 2018-02-17    #日期必须使用ISO 8601格式, 即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式, 时间和日期之间使用T连接, 最后使用+代表时区

对于多行字符串标量,YAML有多种表示方式:

1、普通样式、单/双引号样式(plain, single-quoted, double-quoted)
lines: line1
         line2
       line3
       
       line4
       line5

lines: 'line1
  line2
line3

line4
line5'

转换为python对象:

{'lines': 'line1 line2 line3\nline4 line5'}

转换时,去掉缩进,换行->空格,空行->换行。

2、字面样式(literal )
lines: |
  line1
    line2
  line3
  
  line4
  line5

转换为python对象:

{'lines': 'line1\n  line2\nline3\n\nline4\nline5\n'}

转换时,保留缩进和换行

3、折叠样式(folded)
lines: >
  line1
    line2
  line3
  
  line4
  line5

转换为python对象:

{'lines': 'line1\n  line2\nline3\nline4 line5\n'}

转换时,保留缩进和换行。但相邻、无缩进的两个非空行,会合并成一行,并用一个空格字符分隔。

4、如果是序列中的元素表示多行字符串,请用以下格式:
- >
  line1

序列(Sequences)

序列是一组按次序排列的值,每一个元素都可以是任意数据类型。

以连字符-开头的行构成一个序列:

- A
- B
- C

序列的行内表示:

key: [value1, value2, ...]

映射(Mappings)

映射是一种键值对的集合,其中每个键都必须唯一。

每个键值对用冒号+一个空格分隔(key: value

key: 
  child_key1: value1
  child_key2: value2

</
  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值