Python JSON 和 YAML

PythonBeginner
立即练习

简介

在现代软件开发中,数据通常以标准化的格式进行存储和传输。JSON (JavaScript Object Notation) 和 YAML (YAML Ain't Markup Language) 是最流行的两种格式,从 Web API 响应到应用程序配置文件,无处不在。

在本实验中,你将学习在 Python 中处理这些格式的核心技能。首先,你将使用 Python 内置的 json 模块来读写 JSON 数据。接着,你将探索 YAML 这种更具可读性的替代方案,并学习如何使用 ruamel.yaml 库对其进行解析。最后,你将接触到 anyconfig 库,这是一个强大的工具,它允许你加载各种文件格式的数据,而无需关心底层的实现细节,从而简化配置管理。

处理 JSON

在这一步中,你将学习如何序列化和反序列化 JSON 数据。JSON 代表 JavaScript 对象表示法,是一种用于存储和传输数据的轻量级格式。它常用于服务器向网页发送数据。

注意: 如果你不熟悉如何使用 WebIDE(类似 VS Code),请先通过此实验进行学习。

首先,让我们将一个 Python 字典写入 JSON 文件。这个过程称为序列化。

在左侧的文件资源管理器中,打开 json_handler.py 文件并添加以下代码。该脚本将创建一个名为 output.json 的新文件。

## Write JSON file: json.dump() writes Python object as JSON
import json

content = {"name": "Joe", "age": 20}
with open("output.json", "w") as f:  ## Open file in write mode
    json.dump(content, f, indent=2)  ## Write JSON with 2-space indentation

让我们解析一下这段代码:

  • import json:导入 Python 内置的 JSON 模块。
  • content = {"name": "Joe", "age": 20}:定义我们想要保存的 Python 字典。
  • with open("output.json", "w") as f::以写入模式 ("w") 打开名为 output.json 的文件。
  • json.dump(content, f, indent=2):将 content 字典以 JSON 格式写入文件 f。indent=2 参数使 JSON 以 2 个空格缩进,从而更具可读性。

现在,在终端中运行脚本以创建文件:

python3 json_handler.py

你不会看到任何输出,但系统已经创建了一个名为 output.json 的新文件。你可以使用 cat 命令查看其内容:

cat output.json

你应该能看到格式化后的 JSON 内容:

{
  "name": "Joe",
  "age": 20
}

接下来,让我们将 JSON 文件读取为 Python 对象。这个过程称为反序列化。我们将读取为你准备好的 data.json 文件。

修改 json_handler.py 文件,添加以下代码:

## Read JSON file: json.load() parses JSON from file object
import json

with open("data.json", "r") as f:  ## Open file in read mode
    content = json.load(f)  ## Parse JSON and return Python dict/list
    print(content)

新代码的作用如下:

  • with open("data.json", "r") as f::以读取模式 ("r") 打开现有的 data.json 文件。
  • content = json.load(f):解析文件中的 JSON 数据并将其转换为 Python 字典。
  • print(content):将生成的字典打印到控制台。

再次运行脚本:

python3 json_handler.py

这一次,你将在终端中看到打印出的 Python 字典:

{'username': 'labex', 'id': 12345}

处理 YAML

在这一步中,你将探索 YAML,这是一种专为人类可读性而设计的数据序列化格式。与 JSON 相比,YAML 通常更容易手动维护,并且支持注释,因此成为配置文件的热门选择。

Python 没有内置的 YAML 解析器,因此你需要安装第三方库。目前主要有两个库可用:PyYaml 和 ruamel.yaml。ruamel.yaml 库更符合 YAML 规范,并且在修改文件时能更好地保留注释和格式。我们在本实验中使用它。

首先,使用 pip 安装 ruamel.yaml:

pip install ruamel.yaml

你将看到安装成功的提示信息。

现在,让我们使用该库读取 config.yaml 文件。在编辑器中打开 yaml_handler.py 文件并添加以下代码:

## Read YAML file using ruamel.yaml library
from ruamel.yaml import YAML

with open("config.yaml") as f:
    yaml=YAML()  ## Create YAML parser instance
    data = yaml.load(f)  ## Parse YAML and return Python dict/list
    print(data)

让我们回顾一下代码:

  • from ruamel.yaml import YAML:从库中导入必要的 YAML 类。
  • with open("config.yaml") as f::以读取模式打开 config.yaml 文件。
  • yaml=YAML():创建 YAML 解析器实例。
  • data = yaml.load(f):解析文件中的 YAML 内容并将其转换为 Python 对象(在本例中为字典)。
  • print(data):打印加载的数据。

在终端中执行脚本:

python3 yaml_handler.py

输出将是 YAML 文件内容的 Python 字典表示形式:

{'user': {'name': 'Alex', 'email': 'alex@example.com'}}

使用 Anyconfig

在这一步中,你将了解 anyconfig 包,这是一个非常实用的库,它抽象了底层的配置文件格式。它允许你使用一个简单函数,从 JSON、YAML、TOML 等多种格式中加载 Python 字典。当你的应用程序需要支持多种配置格式时,这非常有用。

首先,你需要安装 anyconfig。由于 anyconfig 需要后端来解析 YAML,而我们已经安装了 ruamel.yaml,它会自动使用该库。

使用 pip 安装 anyconfig:

pip install anyconfig

安装完成后,你就可以使用 anyconfig 加载配置文件了。让我们用它来加载上一步中的同一个 config.yaml 文件。

打开 anyconfig_handler.py 文件并添加以下代码:

## anyconfig: load configuration files in various formats (JSON, YAML, TOML, etc.)
import anyconfig

## anyconfig.load() auto-detects the file format based on the extension.
conf = anyconfig.load("/home/labex/project/config.yaml")
print(conf)

这段代码更加简洁:

  • import anyconfig:导入库。
  • anyconfig.load(...):这个单一函数负责打开、读取和解析文件。它会自动检测 config.yaml 是 YAML 文件并使用相应的解析器。请注意,这里我们使用了绝对路径,当脚本位置可能发生变化时,这是一种良好的实践。

现在,运行脚本:

python3 anyconfig_handler.py

由于此示例仍然加载 config.yaml,输出与上一步相同,但所需的代码更简洁且更具灵活性。

{'user': {'name': 'Alex', 'email': 'alex@example.com'}}

使用 anyconfig,你还可以将 "config.yaml" 替换为 "data.json" 并重新运行脚本。代码无需任何其他更改即可正常工作,但打印出的字典将反映 data.json 的内容,而不是 YAML 文件的内容。

总结

在本实验中,你学习了如何在 Python 中处理两种常见的数据序列化格式:JSON 和 YAML。这些技能对于处理 Web API、管理应用程序配置以及数据交换等任务至关重要。

你首先使用了 Python 内置的 json 模块,通过 json.dump() 将 Python 字典序列化为 JSON 文件,并使用 json.load() 将 JSON 文件反序列化回 Python 对象。

接着,你探索了作为 JSON 人类可读替代方案的 YAML。你学习了如何安装 ruamel.yaml 库并使用它来解析 YAML 文件。

最后,你接触了 anyconfig 库,这是一个简化配置管理的强大工具。你了解了它的 anyconfig.load() 函数如何无需格式特定的代码即可读取不同文件格式的数据,从而使你的应用程序更加灵活且易于维护。