读取YAML文件并创建Python对象

2024-10-02 14:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,尝试阅读YAML文件。基于它的内容,我想创建Python对象。我正在使用ruamel yaml库。 在我的例子中,可能有Python类Message、Signal和Signalgroup等(参见示例文件)。在

我的方法是读取YAML文件,检查每一行是否有给定的关键字,并创建相关的对象并用数据填充它。我认为这是“老派”的方法,也许还有更有效的方法来处理文件。在

可能使用函数register_class/rep创建标记“from yu yaml”,但由于键被索引,因此无法工作。在

Message1:
Message2:
Message3:

还有更专业的方法吗?在

^{pr2}$

Tags: 文件数据对象方法yaml示例内容message
1条回答
网友
1楼 · 发布于 2024-10-02 14:21:29

我建议您在YAML文件中使用标记,并放弃使用名称为Item1Item2(替换为标记对象的列表)的键。在

很难看到数据的确切结构,但是第一步可以是制作YAML文档(假设在一个文件input.yaml

- ModuleName: myTestModule
- Version: 1.0
- ModuleNumbers: [96,97,98,99]


- !Message
  Name: AO3_
  DLC: 8
  Signal1:
    Name: Temperature
    Length: 16
  Signal2:
    Name: AnalogOut3
    Length: 16
    SignalGroup1:  #Comment
       Name: app_fcex
       Type: Bitfield
       Signal1:
           Name: drive_ready
           Length: 1
       Signal2:
           Name: error_active
           Length: 1
       Signal3:
           Name: warning_active
           Length: 1
  Signal3:
    Name: Temperatur 2
    Length: 8
    ValueTable:
       Name: TempStates
       items:
       - !Item
         Name: INIT
         Value: 1
       - !Item
         Name: RUN
         Value: 2
       - !Item
         Name: DONE
         Value: 3
       - !Item
         Name: ERROR
         Value: 4
- !Message
  name: AO2_
  object: RX2
  DLC: 8

然后加载:

^{pr2}$

上面的方法对密钥可用性进行了一些但有限的检查(例如,对Name和{}进行规范化处理。在

上面的print('data')给出了(手工包装):

[{'ModuleName': 'myTestModule'}, 
 {'Version': 1.0}, 
 {'ModuleNumbers': [96, 97, 98, 99]}, 
  Message(name=Signal4, DLC=8, object=None, signals[...]), 
  Message(name=AO2_, DLC=8, object=RX2, signals[])]

并且print(data[3].signals[2]['ValueTable']['items'][2])给出:

Item(name=DONE, value=3)

当然,还应酌情增加其他课程。在

相关问题 更多 >