PyYAML
--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
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
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()
style = '|'
uniquement si la chaîne contient un code de saut de ligne.
aa: |-
bbbb
cccc
dddd
bb: eeee
--Ça fait du bien!
――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
«J'étais curieux, j'ai donc vérifié le code PyYAML.
S'il y a un code de saut de ligne dans
, la variable space_break sera True.
--Puis, tous les indicateurs de Autour d'ici seront définis sur False. 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.
De plus, si vous regardez analy_scalar, le location où ʻallow_block` est défini sur False est Il y a. --Il semble que allow_block soit false mis à «s'il y a un espace à la fin de la chaîne».
Il y a une telle description dans le commentaire, et il semble que la sortie en style bloc ne soit pas également sortie.
- We do not permit trailing spaces for block scalars.
En résumé, s'il y a un saut de ligne après un espace dans la chaîne de caractères, et s'il y a un espace à la fin de la chaîne de caractères, la sortie ne sera pas sortie dans le style de bloc où la chaîne de caractères est interrompue par le code de saut de ligne. est.
«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
«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. ..
Recommended Posts