如何使用 ruamel.yaml 在 YAML 中插入换行符?
How can I insert linebreak in YAML with ruamel.yaml?
这是我的代码
from ruamel.yaml import YAML
yaml = YAML()
user = [{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}]
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048
with open(r'test.yml', 'w') as file:
documents = yaml.dump(test, file)
我得到了这个 YAML 文件
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
我需要在两个用户之间插入一个换行符(最终的 YAML 应该是这样的)
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
如何添加这个空行?
您应该在 ruamel.yaml
中加载您想要的结果。为了好的措施,你可以
然后将其转储回去以查看是否保留了额外的行。如果不是,你可能不会
能够在第一时间写出这样的格式。正如您将看到的,额外的行是
保留,所以如果你
可以从头重建加载的数据。
ruamel.yaml
通常会将注释附加到刚刚解析的节点,所以
您应该调查作为第一个键 'list':
值的序列
import sys
import ruamel.yaml
yaml_str = """\
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
"""
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(yaml_str)
# yaml.dump(data, sys.stdout)
seq = data['category'][0]['users'][0]['list']
print('seq', type(seq), seq.ca)
给出:
seq <class 'ruamel.yaml.comments.CommentedSeq'> Comment(comment=None,
items={0: [CommentToken('\n\n', line: 6, col: 12), None, None, None]})
其中seq.ca
是评论属性。这样的属性不能
添加到普通列表中,因此至少对于数据结构的那部分 user
您需要创建一个 CommentedSeq
实例。也可以看到评论
token 包含两个换行符 (\n\n
)。第一个换行符表示行尾
'a' 后面的注释第一个元素(由 0
表示)为空,第二个
换行符是您在第二个“用户”之前的实际空行。
然而,在第二个用户之前插入该行实际上更容易。 CommentedSeq
实例有
一种允许您在键前添加注释的方法(在本例中键是元素索引):
import sys
import ruamel.yaml
CS = ruamel.yaml.comments.CommentedSeq
yaml = ruamel.yaml.YAML()
user = CS([{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}])
user.yaml_set_comment_before_after_key(1, before='\n')
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048
documents = yaml.dump(test, sys.stdout)
给出:
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
确保修复安装中使用的 ruamel.yaml 版本,
yaml_set_comment_before_after_key
之类的例程可能仍会更改。
测试的时候我一般写到stdout,比较容易看输出是否正确。
如果将 YAML 文档写入文件,则应考虑使用扩展名
.yaml
,至少 15 年来,它一直是此类文件的推荐扩展名。
这是我的代码
from ruamel.yaml import YAML
yaml = YAML()
user = [{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}]
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048
with open(r'test.yml', 'w') as file:
documents = yaml.dump(test, file)
我得到了这个 YAML 文件
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
我需要在两个用户之间插入一个换行符(最终的 YAML 应该是这样的)
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
如何添加这个空行?
您应该在 ruamel.yaml
中加载您想要的结果。为了好的措施,你可以
然后将其转储回去以查看是否保留了额外的行。如果不是,你可能不会
能够在第一时间写出这样的格式。正如您将看到的,额外的行是
保留,所以如果你
可以从头重建加载的数据。
ruamel.yaml
通常会将注释附加到刚刚解析的节点,所以
您应该调查作为第一个键 'list':
import sys
import ruamel.yaml
yaml_str = """\
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
"""
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(yaml_str)
# yaml.dump(data, sys.stdout)
seq = data['category'][0]['users'][0]['list']
print('seq', type(seq), seq.ca)
给出:
seq <class 'ruamel.yaml.comments.CommentedSeq'> Comment(comment=None,
items={0: [CommentToken('\n\n', line: 6, col: 12), None, None, None]})
其中seq.ca
是评论属性。这样的属性不能
添加到普通列表中,因此至少对于数据结构的那部分 user
您需要创建一个 CommentedSeq
实例。也可以看到评论
token 包含两个换行符 (\n\n
)。第一个换行符表示行尾
'a' 后面的注释第一个元素(由 0
表示)为空,第二个
换行符是您在第二个“用户”之前的实际空行。
然而,在第二个用户之前插入该行实际上更容易。 CommentedSeq
实例有
一种允许您在键前添加注释的方法(在本例中键是元素索引):
import sys
import ruamel.yaml
CS = ruamel.yaml.comments.CommentedSeq
yaml = ruamel.yaml.YAML()
user = CS([{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}])
user.yaml_set_comment_before_after_key(1, before='\n')
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048
documents = yaml.dump(test, sys.stdout)
给出:
category:
- year: 2023
users:
- login: login1
fullName: First1 Last1
list:
- a
- login: login2
fullName: First2 Last2
list:
- b
确保修复安装中使用的 ruamel.yaml 版本,
yaml_set_comment_before_after_key
之类的例程可能仍会更改。
测试的时候我一般写到stdout,比较容易看输出是否正确。
如果将 YAML 文档写入文件,则应考虑使用扩展名
.yaml
,至少 15 年来,它一直是此类文件的推荐扩展名。