Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python附加到YAML文件_Python_Python 3.x_Parsing_Yaml_Ruamel.yaml - Fatal编程技术网

如何使用python附加到YAML文件

如何使用python附加到YAML文件,python,python-3.x,parsing,yaml,ruamel.yaml,Python,Python 3.x,Parsing,Yaml,Ruamel.yaml,我有一个名为data.YAML的YAML文件: --- '001': name: Ben email: ben@test.com 我想要一个更新后的文件,如下所示: --- '001': name: Ben email: ben@test.com '002': name: Lisa email: lisa@test.com numbers: - 000-111-2222 - 000-111-2223 如何在python中使用yaml包实现这一点

我有一个名为
data.YAML
的YAML文件:

---
'001':
  name: Ben
  email: ben@test.com
我想要一个更新后的文件,如下所示:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223
如何在python中使用yaml包实现这一点

编辑:

我试过:

import yaml
import io

data = {'002': {'name': 'Lisa', 'email': 'lisa@test.com', 'numbers': ['000-111-2222', '000-111-2223']}}

with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.safe_dump(data, outfile, default_flow_style=False, allow_unicode=True)
方法safe_dump覆盖文件内容,我只将其视为新文件内容

'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223

通常,只需编写额外的代码,就可以不向文件中的YAML文档添加内容 该文件末尾的信息。这可能适用于具有 顶层的映射或序列是块样式,但甚至是 然后,简单的附加只能对文档的某些情况起作用

将YAML加载到Python数据结构很容易, 更新/扩展该结构,然后将其转储回。这样你就不会 必须处理潜在的重复密钥、非裸文档和 使用simple时会导致YAML无效的其他问题 附加。假设您的原始文件名为
input.yaml
,则 下面是诀窍:

import sys
from pathlib import Path
import ruamel.yaml

file_name = Path('input.yaml')

record_to_add = dict(name='Lisa', email='lisa@test.com', numbers=['000-111-2222', '000-111-2223'])

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(file_name)
data['002'] = record_to_add
yaml.dump(data, sys.stdout)
其中:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers:
  - 000-111-2222
  - 000-111-2223

通常,只需编写额外的代码,就可以不向文件中的YAML文档添加内容 该文件末尾的信息。这可能适用于具有 顶层的映射或序列是块样式,但甚至是 然后,简单的附加只能对文档的某些情况起作用

将YAML加载到Python数据结构很容易, 更新/扩展该结构,然后将其转储回。这样你就不会 必须处理潜在的重复密钥、非裸文档和 使用simple时会导致YAML无效的其他问题 附加。假设您的原始文件名为
input.yaml
,则 下面是诀窍:

import sys
from pathlib import Path
import ruamel.yaml

file_name = Path('input.yaml')

record_to_add = dict(name='Lisa', email='lisa@test.com', numbers=['000-111-2222', '000-111-2223'])

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(file_name)
data['002'] = record_to_add
yaml.dump(data, sys.stdout)
其中:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers:
  - 000-111-2222
  - 000-111-2223

使用任何yaml解析器解析文件,相应地编辑dict并将其保存到同一文件中。其中一个解析器:到目前为止你尝试了什么?@klausd.import-io-import-yaml-data={'002'{'name':'Lisa','email':'lisa@test.com“,”numbers':['000-111-2222','000-111-2223']}},io.open('data.yaml','w',encoding='utf8')作为输出文件:yaml.update(数据,输出文件,默认\u flow\u style=False,allow\u unicode=True)将您的代码添加到问题中。它在注释中不可读。@KlausD。我刚刚编辑了这个问题,让您看看我到目前为止尝试了什么。感谢您使用任何yaml解析器预先编辑文件,相应地编辑您的dict并将其保存到同一个文件中。其中一个解析器:到目前为止您尝试了什么?@Klaus D.import io导入yaml数据={'002'{'name':'Lisa','email':'lisa@test.com“,”数字“:['000-111-2222','000-111-2223']}将io.open('data.yaml','w',encoding='utf8')作为输出文件:yaml.update(数据,输出文件,默认\u flow\u style=False,允许\u unicode=True)将您的代码添加到问题中。它在注释中不可读。@KlausD。我刚刚编辑了这个问题,让您看看我到目前为止都做了些什么。提前感谢您使用python3:知道如何将sys.stdout输出写回相同的inputs.yaml吗?@Becks
yaml.dump(数据,文件名)
参见
dump
的第二个参数中的第二个示例,它可以是一个
pathlib.Path
,然后将其打开以进行适当写入,也可以是一个文件指针,如
sys.stdout
fp
,同时使用open('somefile.yaml',wb')执行
作为fp
io.BytesIO
实例。感谢您的帮助@Anthon.Using python3:知道如何将sys.stdout输出写回相同的inputs.yaml吗?@Becks
yaml.dump(数据,文件名)
参见
dump
的第二个参数中的第二个示例,它可以是一个
pathlib.Path
,然后将其打开以进行适当写入,也可以是一个文件指针,如
sys.stdout
fp
,同时使用open('somefile.yaml',wb')执行
作为fp
io.BytesIO
实例。感谢您的帮助@Anthon。