首页 > 解决方案 > 在 Python 中转储时缩进 YAML 列表项

问题描述

上下文

考虑这个最小的工作示例:我有这个 JSON 文件

$ cat main.json
[
  {
    "name": "a",
    "numbers": [1, 2]
  },
  {
    "name": "b",
    "numbers": [10, 20]
  }
]

我需要将该 JSON 文件转换为 YAML。下面的脚本完成了

$ cat main.py
import json, yaml

input_file = open('main.json', 'r')

data_json = json.load(input_file)
data_yaml = yaml.dump(data_json)

print(data_yaml)

如果我们执行这个脚本,我们得到

$ python main.py
- name: a
  numbers:
  - 1
  - 2
- name: b
  numbers:
  - 10
  - 20

问题

我需要将 YAML 列表中的项目再缩进一级。也就是说,输出应该是

- name: a
  numbers:
    - 1
    - 2
- name: b
  numbers:
    - 10
    - 20

代替

- name: a
  numbers:
  - 1
  - 2
- name: b
  numbers:
  - 10
  - 20

附加上下文

请注意,这是一个最小的工作示例。当然,我可以通过手动插入一个缩进级别或执行sed或任何其他工具在所有这些行中插入空格来解决这个问题,但问题是我正在处理大文件,因此检查是否替换变得更加复杂涵盖所有情况,所以我宁愿使用其他方法。

标签: pythonyamlindentationpyyaml

解决方案


您可以考虑使用 rumamel.yaml 代替 PyYAML:

pip install ruamel.yaml

import json
import sys

import ruamel.yaml as yaml


input_file = open('main.json', 'r')

data_json = json.load(input_file)
yaml = yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data_json, sys.stdout)

输出:

  - name: a
    numbers:
      - 1
      - 2
  - name: b
    numbers:
      - 10
      - 20

推荐阅读