在尝试使用ruamel.yaml加载带有注释和别名的yaml时,我得到了换行符。如何防止这种情况发生?
import ruamel.yaml
yaml_conetent = \
"""
entities:
leg0: &leg0
claws:
leg0claw0: {}
leg0claw1: {}
leg1: &leg1
claws:
leg1claw0: {}
leg1claw1: {}
leg2: &leg2
claws:
leg2claw0: {}
leg2claw1: {}
leg3: &leg3
claws:
leg3claw0: {}
leg3claw1: {}
anchors:
cat_with_4_legs: &cat_with_4_legs
legs:
leg0: *leg0
leg1: *leg1
leg2: *leg2
leg3: *leg3
cats:
athena: *cat_with_4_legs # RED
ares: *cat_with_4_legs # WHITE
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_conetent)
yaml.dump(data, sys.stdout),其结果是:
...
cats:
athena: *cat_with_4_legs
# RED
ares: *cat_with_4_legs
# WHITE预期输出:
...
cats:
athena: *cat_with_4_legs # RED
ares: *cat_with_4_legs # WHITE发布于 2022-07-05 16:45:24
这是ruamel.yaml中的一个bug,目前还不清楚是什么原因造成的。
我建议您现在对输出进行后处理:
import sys
import ruamel.yaml
yaml_str = """\
entities:
leg0: &leg0
claws:
leg0claw0: {}
leg0claw1: {}
leg1: &leg1
claws:
leg1claw0: {}
leg1claw1: {}
leg2: &leg2
claws:
leg2claw0: {}
leg2claw1: {}
leg3: &leg3
claws:
leg3claw0: {}
leg3claw1: {}
anchors:
cat_with_4_legs: &cat_with_4_legs
legs:
leg0: leg0
leg1: leg1
leg2: leg2
leg3: leg3
cats:
athena: *cat_with_4_legs # RED
ares: *cat_with_4_legs # WHITE
"""
def fix_alias_comment(s):
res = []
alias_line = None
for line in s.splitlines(True):
if ': *' in line:
alias_line = len(line) - 1
res.append(line)
continue
if alias_line is not None and line.startswith(' ' * alias_line):
res[-1] = res[-1][:-1] + line[alias_line:]
continue
res.append(line)
return ''.join(res)
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout, transform=fix_alias_comment)这意味着:
entities:
leg0:
claws:
leg0claw0: {}
leg0claw1: {}
leg1:
claws:
leg1claw0: {}
leg1claw1: {}
leg2:
claws:
leg2claw0: {}
leg2claw1: {}
leg3:
claws:
leg3claw0: {}
leg3claw1: {}
anchors:
cat_with_4_legs: &cat_with_4_legs
legs:
leg0: leg0
leg1: leg1
leg2: leg2
leg3: leg3
cats:
athena: *cat_with_4_legs # RED
ares: *cat_with_4_legs # WHITE很丑,但它能完成任务
https://stackoverflow.com/questions/72867643
复制相似问题