使用python从Yaml读取和转储[括号,列表]

时间:2019-06-11 11:32:07

标签: python yaml

我正在尝试使用以下代码将列表读取并转储到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

如何获得与输入相同的输出?

3 个答案:

答案 0 :(得分:2)

如果要加载然后转储(也许在修改了一些值之后),PyYAML不是正确的工具,因为它将破坏语法表示中的许多内容。

它将删除您注意到的流样式,但还会删除注释,锚点/别名,特定的整数格式(八进制,十六进制,二进制)等。

在PyYAML中几乎无法控制输出的流式与块式。您可以全包;节点集合作为流,
您可以使用default_flow_style的{​​{1}}参数来实现全流程。

最好使用safe_dump()(免责声明:我是该库的作者),因为它支持已有10年历史的YAML 1.2标准(其中PyYAML仅处理过时的YAML 1.1),并且会使您的输出更接近,并且通常与您的YAML输入相同。

ruamel.yaml

如果您是Python 3,则可以使用:

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)

默认情况下,任何 new 列表(和字典)都是块样式,如果要添加流式列表,则可以使用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

答案 1 :(得分:0)

请查看default_flow_style的{​​{1}}参数。

  

默认情况下,PyYAML根据以下情况选择集合的样式   是否具有嵌套集合。如果集合已嵌套   集合,将为其分配块样式。否则会   具有流样式。

     

如果您希望集合始终以块样式进行序列化,   将dump()的参数default_flow_style设置为False。

https://pyyaml.org/wiki/PyYAMLDocumentation#DumpingYAML

答案 2 :(得分:0)

here所述,使用>>> from datetime import datetime as dt >>> "{0:%Y}-{0:%m}-{0:%d}.h264".format(dt.now()) '2019-06-11.h264' 应该可以解决问题。

但是似乎您实际上需要将其设置为default_flow_style

True