pyyaml 并仅对字符串使用引号

新手上路,请多包涵

我有以下 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 许可协议

阅读 1.9k
1 个回答

我建议您更新为使用 YAML 1.2(2009 年发布)和向后兼容的 ruamel.yaml 包,而不是使用实现大部分 YAML 1.1 (2005) 的 PyYAML。 (免责声明:我是该软件包的作者)。

然后你只需指定 preserve_quotes=True 加载往返 YAML 文件时:

 import sys
import ruamel.yaml

yaml_str = """\
---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3
"""

data = ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True)

输出(包括保留的评论):

 ---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3

加载字符串标量后,它将成为字符串的子类,以便能够容纳引用信息,但对于所有其他目的,它将像普通字符串一样工作。 If you want to replace such a string though ( dev to fgw ) you have to cast the string to this subclass ( DoubleQuotedScalarString from ruamel.yaml.scalarstring )。

往返时 ruamel.yaml 默认情况下保留键的顺序(通过插入)。

原文由 Anthon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题