如何使用 python 更新 yaml 文件?
Posted
技术标签:
【中文标题】如何使用 python 更新 yaml 文件?【英文标题】:How to update yaml file using python? 【发布时间】:2016-09-26 00:23:03 【问题描述】:我是 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】:您打开输出文件以进行附加 (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 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Pipeline Utility Steps 插件更新现有 yaml 文件的内容
如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?