用注释美化 YAML
Prettify YAML with comments
1。摘要
我找不到如何自动美化我的 YAML 文件。
2。数据
示例:
我有 SashaPrettifyYAML.yaml
个文件:
sasha_commands:
# Sasha comment
sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}
3。预期行为
我想删除{大括号}:
sasha_commands:
# Sasha comment
sasha_command_help:
call: sublime.command_help
caption: 'Sasha Command: Command Help'
4。没有帮助
- Pretty YAML (based on PyYAML) and online formatters as YAML Formatter and OnlineYAMLTools删除评论;
- 我在 ruamel.yaml.cmd 中找不到所需的选项;
- align-yaml 对齐,而不是美化 YAML 文件。
在 ruamel.yaml.cmd
中没有执行此操作的选项,但是使用 python 小程序并使用 ruamel.yaml
通过在 ruamel.yaml
中加载和转储来执行此操作相当简单=34=] 模式(默认)。
您唯一需要做的就是确保 data-structure 上的 flow-style 是键 sasha_command_help
的值设置为 block-style(这我是这样解释你对 "prettifying YAML") 的定义的:
import sys
import ruamel.yaml
yaml_str = """\
sasha_commands:
# Sasha comment
sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}
"""
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
data['sasha_commands']['sasha_command_help'].fa.set_block_style()
yaml.dump(data, sys.stdout)
这将准确地给出您期望的输出。
可以在 ruamel.yaml
源的 scalarstring.py
中找到一个递归数据结构 walker,并适用于制作通用 "make-everything-block-style" 例程:
import sys
import ruamel.yaml
def block_style(base):
"""
This routine walks over a simple, i.e. consisting of dicts, lists and
primitives, tree loaded from YAML. It recurses into dict values and list
items, and sets block-style on these.
"""
if isinstance(base, dict):
for k in base:
try:
base.fa.set_block_style()
except AttributeError:
pass
block_style(base[k])
elif isinstance(base, list):
for elem in base:
try:
base.fa.set_block_style()
except AttributeError:
pass
block_style(elem)
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
file_in = sys.argv[1]
file_out = sys.argv[2]
with open(file_in) as fp:
data = yaml.load(fp)
block_style(data)
with open(file_out, 'w') as fp:
yaml.dump(data, fp)
如果您将以上内容存储在 prettifyyaml.py
中,您可以通过以下方式调用它:
python prettifyyaml.py SashaPrettifyYAML.yaml Prettified.yaml
由于您已经在包含嵌入空格的标量周围使用了单引号,因此如果您省略 yaml.preserve_quotes = True
,您将看不到任何变化。但是,如果您使用了双引号标量,那么该行将确保双引号被保留。
我遇到了同样的问题。我写了自己的 YAML 美化器 https://github.com/wangkuiyi/yamlfmt。希望对你有帮助。
我尝试了 Google 的最佳结果,但其中 none 满足了我领导的 https://sqlflow.org/sqlflow 的要求:
- https://pypi.org/project/yamlfmt 无法处理由 ---
分隔的多个 YAML 文档组成的文件
- https://github.com/devopyio/yamlfmt 无法处理多个文件。
- https://github.com/miekg/yamlfmt/blob/master/fmt.go 无法替换(内联编辑)输入文件。
您可以使用 yq 工具 - 它易于安装和使用,而且维护良好。
假设您有example.yml
个文件需要格式化,可以通过以下方式处理:
- 来自文件:
yq r --unwrapScalar -p pv -P example.yml '*'
- 来自标准输入:
cat example.yml | yq r --unwrapScalar -p pv -P - '*'
1。摘要
我找不到如何自动美化我的 YAML 文件。
2。数据
示例:
我有 SashaPrettifyYAML.yaml
个文件:
sasha_commands:
# Sasha comment
sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}
3。预期行为
我想删除{大括号}:
sasha_commands:
# Sasha comment
sasha_command_help:
call: sublime.command_help
caption: 'Sasha Command: Command Help'
4。没有帮助
- Pretty YAML (based on PyYAML) and online formatters as YAML Formatter and OnlineYAMLTools删除评论;
- 我在 ruamel.yaml.cmd 中找不到所需的选项;
- align-yaml 对齐,而不是美化 YAML 文件。
在 ruamel.yaml.cmd
中没有执行此操作的选项,但是使用 python 小程序并使用 ruamel.yaml
通过在 ruamel.yaml
中加载和转储来执行此操作相当简单=34=] 模式(默认)。
您唯一需要做的就是确保 data-structure 上的 flow-style 是键 sasha_command_help
的值设置为 block-style(这我是这样解释你对 "prettifying YAML") 的定义的:
import sys
import ruamel.yaml
yaml_str = """\
sasha_commands:
# Sasha comment
sasha_command_help: {call: sublime.command_help, caption: 'Sasha Command: Command Help'}
"""
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
data['sasha_commands']['sasha_command_help'].fa.set_block_style()
yaml.dump(data, sys.stdout)
这将准确地给出您期望的输出。
可以在 ruamel.yaml
源的 scalarstring.py
中找到一个递归数据结构 walker,并适用于制作通用 "make-everything-block-style" 例程:
import sys
import ruamel.yaml
def block_style(base):
"""
This routine walks over a simple, i.e. consisting of dicts, lists and
primitives, tree loaded from YAML. It recurses into dict values and list
items, and sets block-style on these.
"""
if isinstance(base, dict):
for k in base:
try:
base.fa.set_block_style()
except AttributeError:
pass
block_style(base[k])
elif isinstance(base, list):
for elem in base:
try:
base.fa.set_block_style()
except AttributeError:
pass
block_style(elem)
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
file_in = sys.argv[1]
file_out = sys.argv[2]
with open(file_in) as fp:
data = yaml.load(fp)
block_style(data)
with open(file_out, 'w') as fp:
yaml.dump(data, fp)
如果您将以上内容存储在 prettifyyaml.py
中,您可以通过以下方式调用它:
python prettifyyaml.py SashaPrettifyYAML.yaml Prettified.yaml
由于您已经在包含嵌入空格的标量周围使用了单引号,因此如果您省略 yaml.preserve_quotes = True
,您将看不到任何变化。但是,如果您使用了双引号标量,那么该行将确保双引号被保留。
我遇到了同样的问题。我写了自己的 YAML 美化器 https://github.com/wangkuiyi/yamlfmt。希望对你有帮助。
我尝试了 Google 的最佳结果,但其中 none 满足了我领导的 https://sqlflow.org/sqlflow 的要求:
- https://pypi.org/project/yamlfmt 无法处理由 --- 分隔的多个 YAML 文档组成的文件
- https://github.com/devopyio/yamlfmt 无法处理多个文件。
- https://github.com/miekg/yamlfmt/blob/master/fmt.go 无法替换(内联编辑)输入文件。
您可以使用 yq 工具 - 它易于安装和使用,而且维护良好。
假设您有example.yml
个文件需要格式化,可以通过以下方式处理:
- 来自文件:
yq r --unwrapScalar -p pv -P example.yml '*'
- 来自标准输入:
cat example.yml | yq r --unwrapScalar -p pv -P - '*'