【问题标题】:Control line breaks writing yaml from Python从 Python 编写 yaml 的控制换行符
【发布时间】:2018-06-19 03:03:04
【问题描述】:

我正在使用 Python 3 中的 yaml 库编写 YAML 文件,我想在编写长文本块时选择它放置换行符的位置。

这是我正在尝试做的事情的一个愚蠢的例子。 days 条目是一个很长的文本块,其中有几个项目用逗号分隔。我想将每个项目放在一条线上,但在此示例中,“9 Ladies Dancing”被拆分。

from yaml import safe_load, safe_dump

s = """\
- title: 12 Days of Christmas
- days: A partridge in a pear tree,
    2 Turtle Doves,
    3 French Hens,
    4 Calling Birds,
    5 Gold Rings,
    6 Geese a-Laying,
    7 Swans a-Swimming,
    8 Maids a-Milking,
    9 Ladies Dancing,
    10 Lords a-Leaping,
    11 Pipers Piping,
    12 Drummers Drumming
"""
l = safe_load(s)

print(safe_dump(l, default_flow_style=False))

打印出来:

- title: 12 Days of Christmas
- days: A partridge in a pear tree, 2 Turtle Doves, 3 French Hens, 4 Calling Birds,
    5 Gold Rings, 6 Geese a-Laying, 7 Swans a-Swimming, 8 Maids a-Milking, 9 Ladies
    Dancing, 10 Lords a-Leaping, 11 Pipers Piping, 12 Drummers Drumming

我想将days 的全文加载为一行,但我想将其打印为多行,最多 80 个字符,以便更容易检查项目的正确性。我想要一行中的多个项目,但我想以逗号分隔这些行,这样项目就不会跨行拆分。

【问题讨论】:

    标签: python yaml


    【解决方案1】:

    一个简单的解决方案是将宽度设置为很大,但我不想这样做。

    希望yaml 库有一个我还没有找到的功能,但这是我想出的最好的:

    from yaml import safe_load, safe_dump, SafeDumper, dump
    
    s = """\
    - title: 12 Days of Christmas
    - days: A partridge in a pear tree,
        2 Turtle Doves,
        3 French Hens,
        4 Calling Birds,
        5 Gold Rings,
        6 Geese a-Laying,
        7 Swans a-Swimming,
        8 Maids a-Milking,
        9 Ladies Dancing,
        10 Lords a-Leaping,
        11 Pipers Piping,
        12 Drummers Drumming
    """
    l = safe_load(s)
    
    print(safe_dump(l, default_flow_style=False))
    
    
    class SplitDumper(SafeDumper):
        def write_plain(self, text, split=True):
            delimiter = ','
            if split:
                pieces = text.split(delimiter)
            else:
                pieces = [text]
            buffer = ''
            for i, piece in enumerate(pieces):
                if i > 0:
                    buffer += delimiter
                if self.column-1 + len(buffer) + len(piece) <= self.best_width:
                    buffer += piece
                else:
                    super(SplitDumper, self).write_plain(buffer, split)
                    self.write_indent()
                    buffer = piece
            super(SplitDumper, self).write_plain(buffer)
    
    print(dump(l, default_flow_style=False, Dumper=SplitDumper))
    

    SplitDumper 类重写了write_plain() 方法,以逗号将其拆分为块,然后检测每行可以写入多少块。

    打印出默认拆分,然后是自定义拆分:

    - title: 12 Days of Christmas
    - days: A partridge in a pear tree, 2 Turtle Doves, 3 French Hens, 4 Calling Birds,
        5 Gold Rings, 6 Geese a-Laying, 7 Swans a-Swimming, 8 Maids a-Milking, 9 Ladies
        Dancing, 10 Lords a-Leaping, 11 Pipers Piping, 12 Drummers Drumming
    
    - title: 12 Days of Christmas
    - days: A partridge in a pear tree, 2 Turtle Doves, 3 French Hens, 4 Calling Birds,
         5 Gold Rings, 6 Geese a-Laying, 7 Swans a-Swimming, 8 Maids a-Milking,
         9 Ladies Dancing, 10 Lords a-Leaping, 11 Pipers Piping, 12 Drummers Drumming
    

    【讨论】:

      【解决方案2】:

      字符串加载后已经是单行了:

      >>> l
      [{'title': '12 Days of Christmas'}, {'days': 'A partridge in a pear tree, 2 Turtle Doves, 3 French Hens, 4 Calling Birds, 5 Gold Rings, 6 Geese a-Laying, 7 Swans a-Swimming, 8 Maids a-Milking, 9 Ladies Dancing, 10 Lords a-Leaping, 11 Pipers Piping, 12 Drummers Drumming'}]
      

      您是否考虑过使用块?见Preserve new lines in YAML

      >>> s = """\
      ... - title: 12 Days of Christmas
      ... - days: |-
      ...     A partridge in a pear tree,
      ...     2 Turtle Doves,
      ...     3 French Hens,
      ...     4 Calling Birds,
      ...     5 Gold Rings,
      ...     6 Geese a-Laying,
      ...     7 Swans a-Swimming,
      ...     8 Maids a-Milking,
      ...     9 Ladies Dancing,
      ...     10 Lords a-Leaping,
      ...     11 Pipers Piping,
      ...     12 Drummers Drumming
      ... """
      >>> safe_load(s)
      [{'title': '12 Days of Christmas'}, {'days': 'A partridge in a pear tree,\n2 Turtle Doves,\n3 French Hens,\n4 Calling Birds,\n5 Gold Rings,\n6 Geese a-Laying,\n7 Swans a-Swimming,\n8 Maids a-Milking,\n9 Ladies Dancing,\n10 Lords a-Leaping,\n11 Pipers Piping,\n12 Drummers Drumming'}]
      

      【讨论】:

      • 是的,我希望将文本作为单行加载到内存中。我只想将它作为多行写入 YAML 文件,以便更容易检查正确性。通过以逗号分隔,每个要审查的项目将保持在一起。我会考虑使用一个块,看看这是否对我有用。感谢您的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2016-02-29
      • 2019-04-06
      • 2023-03-19
      • 2012-08-28
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多