我有以下 YAML 文件:
---
my_vars:
my_env: "dev"
my_count: 3
当我用 PyYAML 读取它并再次转储它时,我得到以下输出:
---
my_vars:
my_env: dev
my_count: 3
有问题的代码:
with open(env_file) as f:
env_dict = yaml.load(f)
print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True))
我尝试使用 default_style
参数:
with open(env_file) as f:
env_dict = yaml.load(f)
print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True, default_style='"'))
但现在我得到:
---
"my_vars":
"my_env": "dev"
"my_count": !!int "3"
在不对 YAML 文件中的变量名称做任何假设的 情况下,我需要做什么才能保留原始格式?
原文由 Jeroen Jacobs 发布,翻译遵循 CC BY-SA 4.0 许可协议
我建议您更新为使用 YAML 1.2(2009 年发布)和向后兼容的
ruamel.yaml
包,而不是使用实现大部分 YAML 1.1 (2005) 的 PyYAML。 (免责声明:我是该软件包的作者)。然后你只需指定
preserve_quotes=True
加载往返 YAML 文件时:输出(包括保留的评论):
加载字符串标量后,它将成为字符串的子类,以便能够容纳引用信息,但对于所有其他目的,它将像普通字符串一样工作。 If you want to replace such a string though (
dev
tofgw
) you have to cast the string to this subclass (DoubleQuotedScalarString
fromruamel.yaml.scalarstring
)。往返时
ruamel.yaml
默认情况下保留键的顺序(通过插入)。