使用破折号和键从python中的文件加载列表[重复]

原文标题Load list from file in python with dashes and keys [duplicate]

如何在 Python 中解析 YAML 文件?

原文链接:https://stackoverflow.com//questions/71508379/load-list-from-file-in-python-with-dashes-and-keys

回复

我来回复
  • Jon的头像
    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年前 0条评论
  • Martin Thoma的头像
    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年前 0条评论
  • Anthon的头像
    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()除非你真的完全控制输入,需要它(很少这样)并且知道你在做什么。

    如果你使用 pathlibPath 来操作文件,你最好使用 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年前 0条评论
  • Pal的头像
    Pal 评论

    首先使用 pip3 安装 pyyaml。

    然后导入 yaml 模块并将文件加载到名为“my_dict”的字典中:

    import yaml
    with open('filename.yaml') as f:
        my_dict = yaml.safe_load(f)
    

    这就是你所需要的。现在整个 yaml 文件都在 ‘my_dict’ 字典中。

    2年前 0条评论
  • Prashanth Sams的头像
    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年前 0条评论
  • rinkush sharda的头像
    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年前 0条评论
  • Oleksandr Zelentsov的头像
    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年前 0条评论
  • Wojciech Sciesinski的头像
    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年前 0条评论
  • RtmY的头像
    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 的字段。


    附加参考:

    https://github.com/mikefarah/yq/#install

    https://github.com/kislyuk/yq

    2年前 0条评论
  • Arpan Saini的头像
    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年前 0条评论