How can I parse a YAML file in Python

后端 未结 8 1096
醉话见心
醉话见心 2020-11-22 14:54

How can I parse a YAML file in Python?

相关标签:
8条回答
  • 2020-11-22 15:12

    First install pyyaml using pip3.

    Then import yaml module and load the file into a dictionary called 'my_dict':

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

    That's all you need. Now the entire yaml file is in 'my_dict' dictionary.

    0 讨论(0)
  • 2020-11-22 15:18

    Read & Write YAML files with Python 2+3 (and unicode)

    # -*- 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)
    

    Created YAML file

    a list:
    - 1
    - 42
    - 3.141
    - 1337
    - help
    - €
    a string: bla
    another dict:
      foo: bar
      key: value
      the answer: 42
    

    Common file endings

    .yml and .yaml

    Alternatives

    • CSV: Super simple format (read & write)
    • JSON: Nice for writing human-readable data; VERY commonly used (read & write)
    • YAML: YAML is a superset of JSON, but easier to read (read & write, comparison of JSON and YAML)
    • pickle: A Python serialization format (read & write)
    • MessagePack (Python package): More compact representation (read & write)
    • HDF5 (Python package): Nice for matrices (read & write)
    • XML: exists too *sigh* (read & write)

    For your application, the following might be important:

    • Support by other programming languages
    • Reading / writing performance
    • Compactness (file size)

    See also: Comparison of data serialization formats

    In case you are rather looking for a way to make configuration files, you might want to read my short article Configuration files in Python

    0 讨论(0)
  • 2020-11-22 15:18

    I use ruamel.yaml. Details & debate here.

    from ruamel import yaml
    
    with open(filename, 'r') as fp:
        read_data = yaml.load(fp)
    

    Usage of ruamel.yaml is compatible (with some simple solvable problems) with old usages of PyYAML and as it is stated in link I provided, use

    from ruamel import yaml
    

    instead of

    import yaml
    

    and it will fix most of your problems.

    EDIT: PyYAML is not dead as it turns out, it's just maintained in a different place.

    0 讨论(0)
  • 2020-11-22 15:25

    To access any element of a list in a YAML file like this:

    global:
      registry:
        url: dtr-:5000/
        repoPath:
      dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd
    

    You can use following python script:

    import yaml
    
    with open("/some/path/to/yaml.file", 'r') as f:
        valuesYaml = yaml.load(f, Loader=yaml.FullLoader)
    
    print(valuesYaml['global']['dbConnectionString'])
    
    0 讨论(0)
  • 2020-11-22 15:29

    If you have YAML that conforms to the YAML 1.2 specification (released 2009) then you should use ruamel.yaml (disclaimer: I am the author of that package). It is essentially a superset of PyYAML, which supports most of YAML 1.1 (from 2005).

    If you want to be able to preserve your comments when round-tripping, you certainly should use ruamel.yaml.

    Upgrading @Jon's example is easy:

    import ruamel.yaml as yaml
    
    with open("example.yaml") as stream:
        try:
            print(yaml.safe_load(stream))
        except yaml.YAMLError as exc:
            print(exc)
    

    Use safe_load() unless you really have full control over the input, need it (seldom the case) and know what you are doing.

    If you are using pathlib Path for manipulating files, you are better of using the new API ruamel.yaml provides:

    from ruamel.yaml import YAML
    from pathlib import Path
    
    path = Path('example.yaml')
    yaml = YAML(typ='safe')
    data = yaml.load(path)
    
    0 讨论(0)
  • 2020-11-22 15:30

    Example:


    defaults.yaml

    url: https://www.google.com
    

    environment.py

    from ruamel import yaml
    
    data = yaml.safe_load(open('defaults.yaml'))
    data['url']
    
    0 讨论(0)
提交回复
热议问题