[PYTHON] Geben Sie eine Zeichenfolge mit Zeilenumbrüchen in PyYAML aus

Überblick

PyYAML

Was du machen willst

--Wenn Daten einer Zeichenfolge einschließlich eines solchen Zeilenumbruchs vorhanden sind

 {
      'aa': 'bbbb\ncccc\ndddd',
      'bb': 'eeee'
 }

――Ich möchte im Blockstil mit einem Zeilenumbruchcode wie diesem ausgeben

aa: |
  bbbb
  cccc
  dddd
bb: eeee

Probieren Sie es so aus, wie es ist

import yaml

def main():

    test_dict = {
        'aa': 'bbbb\ncccc\ndddd',
        'bb': 'eeee'
    }
    print(
        yaml.dump(test_dict,
                  allow_unicode=True,
                  encoding='utf-8',
                  default_flow_style=False).decode()
    )


if __name__ == '__main__':
    main()

――Etwas ist anders. ..

aa: 'bbbb

  cccc

  dddd'
bb: eeee

Repräsentant registrieren

import yaml

def represent_str(dumper, instance):
    if "\n" in instance:
        return dumper.represent_scalar('tag:yaml.org,2002:str',
                                       instance,
                                       style='|')
    else:
        return dumper.represent_scalar('tag:yaml.org,2002:str',
                                       instance)

def main():

    test_dict = {
        'aa': 'bbbb\ncccc\ndddd',
        'bb': 'eeee'
    }
    yaml.add_representer(str, represent_str)
    print(
        yaml.dump(test_dict,
                  allow_unicode=True,
                  encoding='utf-8',
                  default_flow_style=False).decode()
    )


if __name__ == '__main__':
    main()

aa: |-
  bbbb
  cccc
  dddd
bb: eeee

--Es fühlt sich gut an!

Es gibt Fälle, in denen es nicht funktioniert. ..

――Wenn ich mit der obigen Implementierung ausgegeben habe, gab es einige Fälle, in denen sie nicht wie erwartet ausgegeben wurde. ――Wenn ich nachforschte, stellte ich fest, dass ein Leerzeichen vor dem Zeilenumbruch der Zeichenfolge nicht ordnungsgemäß ausgegeben wurde.

    test_dict = {
        'aa': 'bbbb\ncccc \ndddd',
        'bb': 'eeee'
    }

――Es bricht nicht. ..

aa: "bbbb\ncccc \ndddd"
bb: eeee

Ich habe es nachgeschlagen

――Ich war neugierig und habe den PyYAML-Code überprüft.

        if space_break or special_characters:
            allow_flow_plain = allow_block_plain =  \
            allow_single_quoted = allow_block = False
        if self.event.style and self.event.style in '|>':
            if (not self.flow_level and not self.simple_key_context
                    and self.analysis.allow_block):
                return self.event.style
Spaces followed by breaks, as well as special character
 are only allowed for double quoted scalars.

Korrespondenz

――So haben wir es am Ende so implementiert.

import yaml
import re


def represent_str(dumper, instance):
    if "\n" in instance:
        instance = re.sub(' +\n| +$', '\n', instance)
        return dumper.represent_scalar('tag:yaml.org,2002:str',
                                       instance,
                                       style='|')
    else:
        return dumper.represent_scalar('tag:yaml.org,2002:str',
                                       instance)


def main():

    test_dict = {
        'aa': 'bbbb\ncccc \ndddd',
        'bb': 'eeee'
    }
    yaml.add_representer(str, represent_str)
    print(
        yaml.dump(test_dict,
                  allow_unicode=True,
                  encoding='utf-8',
                  default_flow_style=False).decode()
    )


if __name__ == '__main__':
    main()
aa: |-
  bbbb
  cccc
  dddd
bb: eeee

YAML ist tief. ..

――Ich habe es nicht richtig untersucht, aber es scheint, dass der Prozess auf den YAML-Spezifikationen basiert. ――Ich habe mich nicht wirklich darum gekümmert, aber die YAML-Spezifikationen scheinen tiefgreifend zu sein. ..

Referenzseite

Recommended Posts

Geben Sie eine Zeichenfolge mit Zeilenumbrüchen in PyYAML aus
[Einführung in Python] So geben Sie eine Zeichenfolge in einer Print-Anweisung aus
Ändern Sie die Zeilenumbruchposition der automatisch formatierten iPython-Ausgabe
Fügen Sie ein Datum ohne Unterbrechungen in CotEditor ein
Hinweis) Stapelkonvertierung bestimmter Symbole in einer Zeichenfolge mit einem Wörterbuch
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] So erweitern Sie Variablen in einer Zeichenfolge
Ich möchte eine Zeichenkette mit Hiragana teilen
[Python] Lassen Sie nur Elemente im Array, die mit einer bestimmten Zeichenfolge beginnen
Zeichenfolgen ohne Zeilenumbrüche in Python anzeigen (persönliches Memo)
[In einer Zeile] Visualisiere wie ein Rasen mit nur Pandas
So geben Sie ein Dokument im PDF-Format mit Sphinx aus
Bis Django etwas mit einem Linienbot zurückgibt!
Grundlagen des Python-Lernens ~ Wie wird eine Zeichenkette ausgegeben (angezeigt)? ~
Ausgabezeilen mit der angegebenen Zeichenfolge
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
[Python] Erstellen Sie ein Programm, das Zeilenumbrüche in der Zwischenablage löscht. + Als Verknüpfung mit Fenstern registrieren
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Drucken Sie mit python3 ohne Unterbrechungen
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Geben Sie die Zeile mit der angegebenen Zeichenfolge aus der Textdatei aus
So extrahieren Sie die gewünschte Zeichenfolge aus einem Befehl in Zeile 4
Speichern Sie YAML-formatierte Dateien mit PyYAML
Erstellen Sie eine zufällige Zeichenfolge in Python
[Golang] Überprüfen Sie, ob eine bestimmte Zeichenfolge in der Zeichenfolge enthalten ist
[Einführung] Fügen Sie Zeilenumbrüche in Python 3 ein
Erstellen Sie mit Django einen LINE-Bot
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Ansible: Zeigt mehrzeilige Befehle an, die vom Shell-Modul in einem fehlerhaften Zustand ausgeführt werden
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Machen Sie es sichtbar, indem Sie die von journalctrl abgeschnittene Linie durchbrechen
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Ich habe mit Python einen Zeichenzähler erstellt
Zeichne mit PyCall ein Herz in Ruby
# 5 [python3] Extrahiert Zeichen aus einer Zeichenfolge
PDF mit Latex-Erweiterung mit Sphinx ausgeben
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Zeichendatendatei mit numpy lesen
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
[Vorläufig] So konvertieren Sie eine Zeichenfolge mit kivy-ios Memo kivy v1.8.0 in Shift_jis
In GCS mit Python platzierte Zeichenketten werden beim Anzeigen mit einem Browser verstümmelt
Ich habe einen Stempelersatzbot mit Linie gemacht
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
[Python] Holen Sie sich die Dateien mit Python in den Ordner
So senden Sie eine Nachricht mit Curl an LINE
Zeichnen Sie in Jupyter ein Diagramm mit japanischen Beschriftungen
Einbetten von Variablen in Python-Strings
Löschen Sie Daten in einem Muster mit Redis Cluster
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Klonen Sie mit einem bestimmten Zweig / Tag in GitPython
Mach ein Janken-Spiel in einer Zeile (Python)
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Zeichenkodierung beim Umgang mit Dateien in Python 3
Extrahieren Sie mit Pandas Zeilen, die eine bestimmte "Zeichenfolge" enthalten
Arbeiten Sie in einer virtuellen Umgebung mit Python virtualenv.