python - 使用 python 从 yaml 读取和转储 [bracket, list]
问题描述
我正在尝试使用以下代码读取列表并将其转储到 yaml
with open(system_bsc_path) as f:
system_bsc_dict = yaml.load(f)
with open(system_bsc_path, "w") as f:
yaml.safe_dump(system_bsc_dict, f)
输入列表,如文件中所示:
chs_per_cath: [[[10, 11, 12, 13], [13000, 13100, 13200, 13300]],
[[16, 17, 18, 19, 20, 21, 22, 23, 24, 25], [13400, 13500, 13600, 13700, 13800, 13900, 14000, 14100, 14200, 14300]],
[[32, 33, 34, 35, 36, 37, 38, 39, 40, 41], [13400, 13500, 13600, 13700, 13800, 13900, 14000, 14100, 14200, 14300]]]
被正确读入python
被转储的输出:
chs_per_cath:
- - - 10
- 11
- 12
- 13
- - 13000
- 13100
- 13200
- 13300
- - - 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- - 13400
- 13500
- 13600
- 13700
- 13800
- 13900
- 14000
- 14100
- 14200
- 14300
- - - 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- - 13400
- 13500
- 13600
- 13700
- 13800
- 13900
- 14000
- 14100
- 14200
- 14300
如何获得与输入相同的输出?
解决方案
如果你想加载,然后转储(可能在修改一些值之后),PyYAML 不是正确的工具,因为它会破坏句法表示中的许多东西。
如您所见,它会丢弃流样式,但也会丢弃注释、锚点/别名、特定整数格式(八进制、十六进制、二进制)等。
PyYAML 中输出的流式与块式几乎没有控制。你可以拥有全块;节点集合作为流,
你可以拥有所有流,使用default_flow_style
参数 to safe_dump()
。
你最好使用ruamel.yaml
(免责声明:我是那个库的作者),因为它支持现在有 10 年历史的 YAML 1.2 标准(其中 PyYAML 只处理过时的 YAML 1.1)并且会让你的输出更接近,并且通常与您的 YAML 输入相同。
from ruamel.yaml import YAML
yaml = YAML()
with open(system_bsc_path) as f:
system_bsc_dict = yaml.load(f)
with open(system_bsc_path, "w") as f:
yaml.dump(system_bsc_dict, f)
如果你是 Python 3,你可以使用:
from pathlib import Path
yaml_file = Path(system_bsc_path)
system_bsc_dict = yaml.load(yaml_file)
yaml.dump(system_bsc_dict, yaml_file)
默认情况下,任何新列表(和字典)都将是块样式,如果要添加流样式列表,则可以使用来设置所有这些列表,或者通过在特殊内部yaml.default_flow_style = True
设置流属性 ( ) 来使用精细控制.fa
表示:
def FSlist(l): # concert list into flow-style (default is block style)
from ruamel.yaml.comments import CommentedSeq
cs = CommentedSeq(l)
cs.fa.set_flow_style()
return cs
system_bsc_dict['existing_field'] = FSlist(["Boston Maestro 4000"])
推荐阅读
- typescript - Angular 7 - PrimeNg ConfirmationDialog 问题
- python - 类实例关系可以是双边的吗?
- c# - 通过 ISecurityTokenValidator.ValidateToken 获得的 ClaimsPrincipal 正在更改 SCP 声明的名称
- c# - 在 C# 中绑定 2 个字段
- javascript - 如何让异步函数使用 Array.Filter 传入元素作为其参数
- javascript - 如何更新 React 中的元素列表
- jenkins - 解除工作人员 RAM 内存限制
- python - Python Selenium 刮取 USPS
- r - R4.0.0 中 RStudio Server 和 Shiny Server 中的 OpenStreetMaps 自动绘图错误
- ios - UICollectionViewCell -- 使 selectedBackgroundView 比单元格本身大