Python YAML转储到单行

7fhtutme  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(201)

我想把一个python对象转储到一个只包含一行的YAML字符串中。但是,ruamel.yaml.safe_dump会附加换行符以及(有时)'...'
例如,转储list或dict对象时会附加一个换行符:

import ruamel.yaml as yaml
yaml.safe_dump([1, None], default_flow_style=None)

输出:'[1, null]\n'我需要的输出是:'[1, null]'
转储“标量”对象时,会附加更多内容:

import ruamel.yaml as yaml
yaml.safe_dump(None, default_flow_style=None)

输出:'null\n...\n'我需要的输出是:'null'
我认为这两个预期输出都是有效的YAML语法,即

yaml.safe_load('null')

正确返回None
有没有什么方法(除了手动删除尾随的换行符和'...',这是非常hacky)来实现我想要的?

myzjeezk

myzjeezk1#

你不应该在ruamel.yaml中使用旧的API,它已经过时,即将被删除。
如果您希望所有内容都在一行中,则可能应该根据数据结构的复杂程度使用.default_flow_style = True,并加宽输出,以免出现换行。
与JSON相反,YAML通常会附加一个换行符,因此最好只是转换输出,以便在第一个换行符之后添加任何内容。

import sys
import ruamel.yaml

class DSL:
    def __init__(self):
        pass

    @property
    def yaml(self):
        try:
            return self._yaml
        except AttributeError:
            pass
        yaml = ruamel.yaml.YAML(typ='safe')
        yaml.default_flow_style = True
        yaml.width = 2048
        self._yaml = yaml
        return yaml

    def __call__(self, data, stream=sys.stdout):
        def strip_nl(s):
            result, rest = s.split('\n', 1)
            if rest not in ['', '...\n']:
                print('multi-line YAML output', repr(rest))
                sys.exit(1)
            return result

        self.yaml.dump(data, stream, transform=strip_nl)

dsl = DSL()

sys.stdout.write('|')
dsl([1, None])
sys.stdout.write('|\n')
sys.stdout.write('|')
dsl(None)
sys.stdout.write('|\n')
sys.stdout.write('|')
dsl(dict(a=[1, None], b=42))
sys.stdout.write('|\n')

其给出:

|[1, null]|
|null|
|{a: [1, null], b: 42}|

相关问题