PyYAML
--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
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
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 = '|'
nur an, wenn die Zeichenfolge einen Zeilenvorschubcode enthält.
aa: |-
bbbb
cccc
dddd
bb: eeee
--Es fühlt sich gut an!
――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 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.
Wenn Sie sich analyse_scalar ansehen, ist der Speicherort, in dem allow_block
auf False gesetzt ist Es gibt.
Es scheint, dass allow_block false ist und auf "wenn am Ende der Zeichenfolge ein Leerzeichen steht" gesetzt ist.
Der Kommentar enthält eine solche Beschreibung, und es scheint, dass die Ausgabe im Blockstil nicht ebenfalls ausgegeben wird.
- We do not permit trailing spaces for block scalars.
Zusammenfassend lässt sich sagen, dass bei einem Zeilenumbruch nach einem Leerzeichen in der Zeichenfolge und einem Leerzeichen am Ende der Zeichenfolge die Ausgabe nicht in dem Blockstil ausgegeben wird, in dem die Zeichenfolge durch den Zeilenvorschubcode unterbrochen wird. ist.
――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
――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. ..
Recommended Posts