如何使用python更新yaml文件?

时间:2016-05-27 15:27:31

标签: python yaml pyyaml

我是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

这里的每个附件都是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) )

1 个答案:

答案 0 :(得分:0)

打开输出文件以追加(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')