如何使用 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')
)
我是 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')
)