【问题标题】:YAML: Dump Python List Without QuotesYAML:转储不带引号的 Python 列表
【发布时间】:2019-01-16 08:30:54
【问题描述】:

我有一个 Python 列表,my_list,看起来像这样 ["test1", "test2", "test3"]。我只是想将它转储到不带引号的 YAML 文件中。所以想要的输出是:

test_1
test_2
test_3

我试过了:

import yaml
with open("my_yaml.yaml", "w") as f:
    yaml.safe_dump(my_list, f)

不幸的是,这包括一行中的所有 3 个元素,并且它们被引用了:

'test_1', 'test_2', 'test_3'

如何修改以获得所需的输出?

【问题讨论】:

    标签: python yaml


    【解决方案1】:

    尝试使用default_style=None 避免使用引号,并尝试使用default_flow_style=False 在不同的行上输出项目:

    yaml.safe_dump(my_list, f, default_style=None, default_flow_style=False)
    

    【讨论】:

    • 谢谢。所以它现在是每行一个,但它有一个破折号来开始每一行并且仍然被引用:(
    • 您的实际数据必须包含特殊字符,在这种情况下无论如何都会被引用。使用您的示例数据test_1 等,它不会被引用。每行开头之前的破折号就是 YAML 格式化列表数据的方式。
    【解决方案2】:

    您希望将 Python 列表输出为多行纯标量,并且 会很艰难。通常一个列表是输出一个 YAML 序列,它 有破折号(-,块样式,多行)或使用 方括号([],流式,一行或多行。

    带有破折号的块样式:

    import sys
    from ruamel.yaml import YAML
    
    data = ["test1", "test2", "test3"]
    
    yaml = YAML()
    yaml.dump(data, sys.stdout)
    

    给予:

    - test1
    - test2
    - test3
    

    流动风格,在一条窄线上:

    yaml = YAML()
    yaml.default_flow_style = True
    yaml.dump(data, sys.stdout)
    

    输出:

    流式,变窄:

    [test1, test2, test3]
    yaml = YAML()
    yaml.default_flow_style = True
    yaml.width = 5
    yaml.dump(data, sys.stdout)
    

    让你:

    [test1,
    test2,
    test3]
    

    这不太可能是您想要的,因为它会影响整个 YAML 文档, 你仍然得到方括号。

    另一种方法是将字符串转换为纯标量。这是 实际上,您想要的输出将被加载为。

    yaml_str = """\
    test_1
    test_2
    test_3
    """
    
    yaml = YAML()
    x = yaml.load(yaml_str)
    assert type(x) == str
    assert x == 'test_1 test_2 test_3'
    

    加载您的预期输出通常是一个很好的测试,可以查看您的内容 需要提供。

    因此,您必须将列表转换为多字 细绳。再一次的问题是你只能强制这条线 通过设置 文档,并且大多数文件的最小宽度大于 4 (虽然可以修补但不能解决问题 这适用于整个文档)。

    yaml = YAML()
    yaml.width = 5
    s = ' '.join(data)
    yaml.dump(s, sys.stdout)
    

    结果:

    test1 test2
    test3
    ...
    

    如果您真的不想要破折号,这将是 IMO 的最佳解决方案: 使用literal block style scalar(字符串):

    from ruamel.yaml.scalarstring import PreservedScalarString
    
    yaml = YAML()
    s = PreservedScalarString('\n'.join(data) + '\n')
    yaml.dump(s, sys.stdout)
    

    保留标量样式的换行符:

    |
    test1
    test2
    test3
    

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 2018-11-04
      • 2020-11-16
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2014-10-26
      相关资源
      最近更新 更多