【问题标题】:python yaml.dump format list in other YAML formatpython yaml.dump 其他 YAML 格式的格式列表
【发布时间】:2014-07-06 03:51:56
【问题描述】:

我想将 Python 对象转储到 YAML 文件中,如下所示:

a: 5
b: 6
c: 7
d: [ 1,2,3,4]

但不是

a: 5 
b: 6
c: 7
d 
- 1
- 2
- 3
- 4

图像 d 是一个庞大的列表,输出变得杂乱无章。

我使用:default_flow_style=False,但这使用了新的行列表项格式。

我已经使用客户倾倒器来阻止锚点。

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    sbarzowski 的评论奏效了。

    我已经用 PyYaml 5.4.1 测试了 python 3.9

    yaml.dumpdefault_flow_style=None 一起使用,以获得所需的效果。

    【讨论】:

      【解决方案2】:

      在使用 YAML 几个小时后,我使用 JSON 做了类似的事情

      【讨论】:

        【解决方案3】:

        如果您想控制您的键的排序方式并精确控制特定映射/字典和序列/列表的流/块样式,您应该使用ruamel.yaml 用于往返的特殊功能创建您的对象.最简单的方法是加载 str YAML 源代码:

        import sys
        import ruamel.yaml as yaml
        
        yaml_str = """\
        a: 5
        b: 6
        c: 7
        d: [ 1,2,3,4]
        """
        
        data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
        print(data)
        yaml.dump(data, sys.stdout, Dumper=yaml.RoundTripDumper)
        

        gives(保留顺序和流样式,但更改序列中项目周围的间距,我希望你可以接受):

        a: 5
        b: 6
        c: 7
        d: [1, 2, 3, 4]
        

        从头开始:

        import sys
        import ruamel.yaml as yaml
        from ruamel.yaml.comments import CommentedSeq, CommentedMap
        
        cm = CommentedMap()
        cm['a'] = 5
        cm['b'] = 6
        cm['c'] = 7
        cm['d'] = cl = CommentedSeq([1, 2, 3])
        cl.append(4)
        cl.fa.set_flow_style()
        yaml.dump(cm, sys.stdout, Dumper=yaml.RoundTripDumper)
        

        这会为您提供与上述完全相同的输出。

        抑制别名 IMO 输出的最简单方法是使用

        dumper = yaml.RoundTripDumper
        dumper.ignore_aliases = lambda *args : True
        yaml.dump(data, sys.stdout, Dumper=dumper)
        

        ¹ 免责声明我是ruamel.yaml的作者

        【讨论】:

          【解决方案4】:

          您需要提供您要转储的字典。

          yaml.dump() 将根据您拥有的字典正常工作。

          %python u
          first: [1, 2, 3]
          second: bar
          
          %cat u
          import yaml
          
          d = { "first" : [1,2,3], "second" : "bar" }
          print (yaml.dump(d))
          

          【讨论】:

            【解决方案5】:

            以下结果是否符合您的期望?

            >>> import yaml
            >>> dct = {"a": 5, "b": 6, "c": 7, "d": range(60)}
            >>> print yaml.dump(dct)
            a: 5
            b: 6
            c: 7
            d: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
              22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
              42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
            

            请注意,换行符是 yaml 添加的,而不是我添加的。

            【讨论】:

            • 今天遇到这个问题,没用。 PyYAML 的默认值已更改,因此要获得本文中描述的效果,必须将 default_flow_style=None 传递给 yaml.dump(以启用用于确定列表样式的启发式方法)。
            猜你喜欢
            • 2013-08-20
            • 2014-01-29
            • 1970-01-01
            • 2021-11-06
            • 2020-11-16
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多