python - 在 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
或任何其他工具在所有这些行中插入空格来解决这个问题,但问题是我正在处理大文件,因此检查是否替换变得更加复杂涵盖所有情况,所以我宁愿使用其他方法。
解决方案
您可以考虑使用 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
推荐阅读
- svg - 嵌套中的图像
不显示在铬中 - javascript - Javascript'THIS'值使用构造函数而不分配给变量
- c# - 在数据层而不是单层应用程序中进行审计
- dart - 使用 Flutter 范围模型的主细节
- javascript - 如何在 Vue.js 中为动态输入字段设置默认值?
- c++ - 无限循环使程序停止工作
- revit - 将 Autodesk Revit 模型转换或导出为 USDZ
- apigee - APIGEE - 超过 2 个 WSDL 到同一个代理
- jquery - Wordpress gutenberg 块 - jquery 生成的内容未保存
- java - 通过 JDBC 更新用户密码不起作用