[PYTHON] Sortie d'une chaîne avec des sauts de ligne dans PyYAML

Aperçu

PyYAML

Chose que tu veux faire

--Lorsqu'il y a des données d'une chaîne de caractères comprenant un tel saut de ligne

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

Je veux sortir en style bloc avec un code de saut de ligne comme celui-ci

aa: |
  bbbb
  cccc
  dddd
bb: eeee

Essayez-le tel quel

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()

«Quelque chose est différent. ..

aa: 'bbbb

  cccc

  dddd'
bb: eeee

Inscription du représentant

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

--Ça fait du bien!

Il y a des cas où cela ne fonctionne pas. ..

――Lorsque je produisais avec l'implémentation ci-dessus, il y avait des cas où elle n'était pas sortie comme prévu. ――Lorsque j'ai enquêté, j'ai trouvé que s'il y avait un espace avant le saut de ligne de la chaîne de caractères, il ne serait pas affiché correctement. --Pour de telles données

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

«Ça ne casse pas. ..

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

Je l'ai cherché

«J'étais curieux, j'ai donc vérifié le code PyYAML.

        if space_break or special_characters:
            allow_flow_plain = allow_block_plain =  \
            allow_single_quoted = allow_block = False

--Lors de la sortie de yaml, jugez le style dans cette méthode choose_scalar_style Il est conçu pour sortir. --Originalement, tel qu'implémenté précédemment, il devrait être affiché dans le style spécifié par la méthode ʻadd_representer, mais parmi les indicateurs ci-dessus, le style spécifié que ʻallow_block est False (ici| Il n'est pas émis avec).

        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.

Correspondance

«Donc, à la fin, nous l'avons implémenté comme ça.

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 est profond. ..

«Je ne l'ai pas étudié correctement, mais il semble que le processus soit basé sur les spécifications YAML. «Je m'en fichais vraiment, mais les spécifications YAML semblent profondes. ..

Site de référence

Recommended Posts

Sortie d'une chaîne avec des sauts de ligne dans PyYAML
[Introduction à Python] Comment générer une chaîne de caractères dans une instruction Print
Modifier l'emplacement du saut de ligne de la sortie formatée automatiquement iPython
Insérer une date sans interruption dans CotEditor
Remarque) Conversion par lots de symboles spécifiques contenus dans une chaîne de caractères avec un dictionnaire
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment développer des variables dans une chaîne de caractères
Je veux diviser une chaîne de caractères avec hiragana
[Python] Ne laissez que les éléments commençant par une chaîne de caractères spécifique dans le tableau
Afficher les chaînes de caractères sans saut de ligne en python (mémo personnel)
[En une seule ligne] Visualisez comme une pelouse avec seulement des pandas
Comment sortir un document au format pdf avec Sphinx
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
Les bases de l'apprentissage Python ~ Comment générer (afficher) une chaîne de caractères ~
Lignes de sortie contenant la chaîne spécifiée
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
[Python] Créez un programme qui supprime les sauts de ligne dans le presse-papiers + Enregistrez-vous comme raccourci avec Windows
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Imprimez avec python3 sans interruption
Essayez d'extraire une chaîne de caractères d'une image avec Python3
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Sortie de la ligne contenant la chaîne de caractères spécifiée à partir du fichier texte
Comment extraire la chaîne de caractères souhaitée à partir d'une ligne 4 commandes
Enregistrer les fichiers au format YAML avec PyYAML
Créer une chaîne aléatoire en Python
[Golang] Vérifiez si une chaîne de caractères spécifique est incluse dans la chaîne de caractères
[Introduction] Insérer des sauts de ligne dans Python 3
Créer un bot LINE avec Django
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Ansible: affiche les commandes multilignes exécutées par le module shell dans un état interrompu
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
Rendez-le visible en coupant la ligne coupée par journalctrl
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
J'ai fait un compteur de caractères avec Python
Dessinez un cœur en rubis avec PyCall
# 5 [python3] Extraire des caractères d'une chaîne de caractères
Sortie PDF en utilisant l'extension Latex avec Sphinx
Générer une classe à partir d'une chaîne en Python
Lire le fichier de données de caractères avec numpy
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
[Tentative] Comment convertir une chaîne de caractères en Shift_jis avec kivy-ios Memo kivy v1.8.0
Les chaînes de caractères placées dans GCS avec python sont déformées lorsqu'elles sont visualisées avec un navigateur
J'ai fait un robot de remplacement de tampon avec une ligne
Envoyer un message à LINE avec Python (LINE Notify)
[Python] Récupérez les fichiers dans le dossier avec Python
Comment envoyer un message à LINE avec curl
Dessinez un graphique avec des étiquettes japonaises dans Jupyter
Comment incorporer des variables dans des chaînes python
Supprimer des données dans un modèle avec Redis Cluster
Créer un LINE BOT avec Minette pour Python
Créer un environnement virtuel avec conda avec Python
Créez un environnement Django avec Vagrant en 5 minutes
Cloner avec une branche / balise spécifique dans GitPython
Créez un jeu Janken en une seule ligne (python)
J'ai créé un Bot LINE avec Serverless Framework!
Encodage de caractères lors du traitement de fichiers en Python 3
Extraire des lignes contenant une "chaîne" spécifique avec Pandas
Travaillez dans un environnement virtuel avec Python virtualenv.