在 Python 中转储时缩进 YAML 列表的项目
Indent items of YAML lists when dumping in Python
上下文
考虑这个最小的工作示例:我有这个 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
或任何其他工具在所有这些行中插入空格来解决这个问题,但问题是我正在处理大文件所以它变得更加复杂检查替换是否覆盖所有情况,所以我宁愿使用其他方法。
您可以考虑使用 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
上下文
考虑这个最小的工作示例:我有这个 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
或任何其他工具在所有这些行中插入空格来解决这个问题,但问题是我正在处理大文件所以它变得更加复杂检查替换是否覆盖所有情况,所以我宁愿使用其他方法。
您可以考虑使用 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