如何使用 python 更新 yaml 文件?

How to update yaml file using python?

我是 python 和 YAML 的新手,我有一种情况需要保留此文件,并附加相关数据

__blocks: {}
        messages:
            CANMessages:
            -   CAN: !!python/unicode 'IuK-CAN'
                D0:
                - 13
                D1:
                - 0
                D2:
                - 0
                D3:
                - 0
                D4:
                - 0
                D5:
                - 0
                D6:
                - 240
                D7:
                - 0
                DL: 7
                Description: !!python/unicode 'clo'
                ID: 574
                Period: -1
                id: d3206970-20f2-11e6-bfd7-185e0fc5ec33
                timestamp: 1464013797.767
            -   CAN: !!python/unicode 'IuK-CAN'
                D0:
                - 13
                D1:
                - 0
                D2:
                - 0
                D3:
                - 0
                D4:
                - 0
                D5:
                - 0
                D6:
                - 240
                D7:
                - 0
                DL: 7
                Description: !!python/unicode 'cli'
                ID: 574
                Period: -1
                id: d37y069700f2-11e6-bfd7-185e0fc5ec33
                timestamp: 1487013797.767
            MOSTMessages: []
        pages: []
        settings: {}

这里只需要追加的内容就是-CAN到时间戳的部分

- CAN:                                        //1
 ..
 timestamp: xyznumbers
- CAN:                                        //2
 ..
 timestamp: xyznumbers
- CAN:                                        //n
 ..
 timestamp: xyznumbers

这里的每一个append都是一个CAN的测试场景。

我写的逻辑实际上是一遍又一遍地附加所有内容,我不知道如何只附加所需的块。

data = {'__blocks': {}, 
                'messages': 
                    {'CANMessages': 
                     [
                      {'DL': 7, 
                       'Description': u'%s'%self.Description, 
                       'timestamp': current_milli_time, 
                       'D3': ['%s'%self.D3], 
                       'Period': self.Period, 
                       'ID': hex(self.ID), 
                       'CAN': u'%s'%self.CAN, 
                       'D6': ['%s'%self.D6], 
                       'D7': ['%s'%self.D7], 
                       'D4': ['%s'%self.D4], 
                       'D5': ['%s'%self.D5], 
                       'D2': ['%s'%self.D2], 
                       'id': 'xxx-xxx-xxx-xxx', 
                       'D0': ['%s'%self.D0], 
                       'D1': ['%s'%self.D1]
                       }
                      ],
                       'MOSTMessages': []}, 
                       'pages': [], 
                       'settings': {}}            


        with open(fileMock, 'a') as outfile:
            outfile.write( yaml.dump(data, default_flow_style=False) )

您打开输出文件进行追加(open(fileMock, 'a')),每次都写入整个数据结构。你可能根本不应该在 YAML 文件上使用 a,除非你想在文件中包含多个文档。

将所有元素追加到数据结构data,然后写出一次:

    with open(fileMock, 'w') as outfile:
        outfile.write( yaml.dump(data, default_flow_style=False))

(注意 'w' 参数到 open()

或者,您可以读取追加,一次一个项目,但随后您必须将 YAML 读回 data,最好使用 ruamel.yaml.round_trip_load() 以保留您的键顺序和布局,追加将新数据放在正确的位置,然后转储到 YAML 文件(再次使用 open(fileMock, 'w') 而不是 open(fileMock, 'a')