使用破折号和键从python中的文件加载列表[重复]
原文标题 :Load list from file in python with dashes and keys [duplicate]
如何在 Python 中解析 YAML 文件?
回复
我来回复-
Jon 评论
该回答已被采纳!
不依赖 C 头文件的最简单、最纯粹的方法是 PyYaml(文档),可以通过
pip install pyyaml
安装:#!/usr/bin/env python import yaml with open("example.yaml", "r") as stream: try: print(yaml.safe_load(stream)) except yaml.YAMLError as exc: print(exc)
就是这样。一个普通的
yaml.load()
函数也存在,但yaml.safe_load()
应该始终是首选,除非您明确需要提供任意对象序列化/反序列化以避免引入任意代码执行的可能性。请注意,PyYaml 项目支持通过 YAML 1.1 规范的版本。如果需要 YAML 1.2 规范支持,请参阅此答案中的 Ruamel.yamlas。
此外,您还可以使用 pyyaml 的替代品,以保持您的 yaml 文件的顺序与您拥有它的方式相同,称为 oyaml。 oyaml 的 Viewsynk 在这里
2年前 -
Martin Thoma 评论
使用 Python 2+3(和 unicode)读写 YAML 文件
# -*- coding: utf-8 -*- import yaml import io # Define data data = { 'a list': [ 1, 42, 3.141, 1337, 'help', u'€' ], 'a string': 'bla', 'another dict': { 'foo': 'bar', 'key': 'value', 'the answer': 42 } } # Write YAML file with io.open('data.yaml', 'w', encoding='utf8') as outfile: yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True) # Read YAML file with open("data.yaml", 'r') as stream: data_loaded = yaml.safe_load(stream) print(data == data_loaded)
创建 YAML 文件
a list: - 1 - 42 - 3.141 - 1337 - help - € a string: bla another dict: foo: bar key: value the answer: 42
常见文件结尾
.yml
和.yaml
备择方案
- CSV:超级简单的格式(读写)
- JSON:非常适合编写人类可读的数据;非常常用(读写)
- YAML:YAML 是 JSON 的超集,但更易于阅读(读写,JSON 和 YAML 的比较)
- pickle:一种 Python 序列化格式(读写)
- MessagePack(Python 包):更紧凑的表示(读写)
- HDF5(Python 包):适用于矩阵(读写)
- XML: 也存在 *sigh* ( 读 & 写 )
对于您的应用程序,以下内容可能很重要:
- 其他编程语言的支持
- 读/写性能
- 紧凑性(文件大小)
另见:数据序列化格式的比较
如果您正在寻找一种制作配置文件的方法,您可能需要阅读我的简短文章 Python 中的配置文件
2年前 -
Anthon 评论
如果您有符合 YAML 1.2 规范(2009 年发布)的 YAML,那么您应该使用 uamel.yaml(免责声明:我是该软件包的作者)。它本质上是 PyYAML 的超集,它支持大部分 YAML 1.1(从 2005 年开始) .
如果您希望能够在往返时保留您的评论,您当然应该使用 ruamel.yaml。
升级@Jon 的例子很简单:
import ruamel.yaml as yaml with open("example.yaml") as stream: try: print(yaml.safe_load(stream)) except yaml.YAMLError as exc: print(exc)
使用
safe_load()
除非你真的完全控制输入,需要它(很少这样)并且知道你在做什么。如果你使用 pathlib
Path
来操作文件,你最好使用 ruamel.yaml 提供的新 API:from ruamel.yaml import YAML from pathlib import Path path = Path('example.yaml') yaml = YAML(typ='safe') data = yaml.load(path)
2年前 -
Pal 评论
首先使用 pip3 安装 pyyaml。
然后导入 yaml 模块并将文件加载到名为“my_dict”的字典中:
import yaml with open('filename.yaml') as f: my_dict = yaml.safe_load(f)
这就是你所需要的。现在整个 yaml 文件都在 ‘my_dict’ 字典中。
2年前 -
Prashanth Sams 评论
例子:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml data = yaml.safe_load(open('defaults.yaml')) data['url']
2年前 -
rinkush sharda 评论
要访问 YAML 文件中列表的任何元素,如下所示:
global: registry: url: dtr-:5000/ repoPath: dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd
您可以使用以下 python 脚本:
import yaml with open("/some/path/to/yaml.file", 'r') as f: valuesYaml = yaml.load(f, Loader=yaml.FullLoader) print(valuesYaml['global']['dbConnectionString'])
2年前 -
Oleksandr Zelentsov 评论
我在这里使用uamel.yaml.Details & 辩论。
from ruamel import yaml with open(filename, 'r') as fp: read_data = yaml.load(fp)
ruamel.yamlis 的用法与 PyYAML 的旧用法兼容(有一些简单的可解决问题),正如我提供的链接中所述,使用
from ruamel import yaml
代替
import yaml
它会解决你的大部分问题。
编辑:事实证明,PyYAML 并没有死,它只是在不同的地方维护。
2年前 -
Wojciech Sciesinski 评论
#!/usr/bin/env python import sys import yaml def main(argv): with open(argv[0]) as stream: try: #print(yaml.load(stream)) return 0 except yaml.YAMLError as exc: print(exc) return 1 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))
2年前 -
RtmY 评论
建议:使用 yq(可通过 pip 获得)
我不确定以前是怎么不建议的,但我强烈建议使用 yqwhich 是 YAML 的 ajqwrapper。
yq 使用类似 jq 的语法,但适用于 yaml 文件以及 json。
例子:
1)读取一个值:
yq e '.a.b[0].c' file.yaml
2 ) 来自 STDIN 的管道:
cat file.yaml | yq e '.a.b[0].c' -
3)更新一个yaml文件,就地
yq e -i '.a.b[0].c = "cool"' file.yaml
4)使用环境变量更新:
NAME=mike yq e -i '.a.b[0].c = strenv(NAME)' file.yaml
5)合并多个文件:
yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml
6 ) 对一个 yaml 文件的多次更新:
yq e -i ' .a.b[0].c = "cool" | .x.y.z = "foobar" | .person.name = strenv(NAME) ' file.yaml
(*) 阅读更多关于如何使用基于 onjq 过滤器解析来自 yaml 的字段。
附加参考:
2年前 -
Arpan Saini 评论
read_yaml_file function returning all data into a dictionary.
def read_yaml_file(full_path=None, relative_path=None): if relative_path is not None: resource_file_location_local = ProjectPaths.get_project_root_path() + relative_path else: resource_file_location_local = full_path with open(resource_file_location_local, 'r') as stream: try: file_artifacts = yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) return dict(file_artifacts.items())
2年前