Como posso processar um ficheiro YAML em Python

Como posso processar um ficheiro YAML em Python?

 363
Author: Omer Dagan, 2009-11-21

7 answers

O método mais fácil e pureista sem depender de cabeçalhos C é PyYaml:

#!/usr/bin/env python

import yaml

with open("example.yaml", 'r') as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)
E é isso. Mais informações aqui:

Http://pyyaml.org/wiki/PyYAMLDocumentation

 502
Author: Jon, 2018-05-08 16:13:44

Ler e escrever ficheiros YAML com Python 2+3 (e 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.load(stream)

print(data == data_loaded)

Criou o ficheiro YAML

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

Terminações de ficheiros comuns

.yml e .yaml

Alternativas

Para a sua aplicação, pode ser importante o seguinte:

    Apoio por outras linguagens de programação
  • leitura / escrita
  • compacidade (Tamanho do ficheiro)

Ver também: comparação dos formatos de serialização dos Dados

No caso de estar à procura de uma forma de criar ficheiros de configuração, poderá querer ler o meu pequeno artigo ficheiros de configuração em Python

 35
Author: Martin Thoma, 2017-05-23 12:26:38

Se tiver YAML que esteja em conformidade com a especificação YAML 1.2 (lançada em 2009) então deve usar ruamel.yaml (disclaimer: eu sou o autor desse pacote). É essencialmente um superconjunto de PyYAML, que suporta a maior parte do YAML 1.1 (a partir de 2005).

Se quiser ser capaz de preservar os seus comentários ao tropeçar, deve certamente usar o ruamel.yaml.

Actualizar o exemplo do @Jon é fácil:

import ruamel.yaml as yaml

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

Utilize safe_load() a não ser que esteja realmente cheio controle sobre a entrada, precisar dele (raramente o caso) e saber o que você está fazendo.

Se está a usar o pathlib Path para manipular ficheiros, é melhor usar o novo ruamel da API.yaml fornece:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
 32
Author: Anthon, 2018-08-23 17:12:55

Importar o módulo yaml e carregar o ficheiro num dicionário chamado 'my_dict':

import yaml
my_dict = yaml.load(open('filename'))
É tudo o que precisas. Agora todo o arquivo yaml está no dicionário' my_dict'.
 12
Author: Pal, 2018-06-05 03:18:51

Exemplo:

Defaults.yaml

url: https://www.google.com

Environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']
 4
Author: Prashanth Sams, 2018-05-20 07:41:44

Eu uso ruamel.yaml . detalhes e debate aqui.

from ruamel import yaml

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

Uso de ruamel.o yaml é compatível (com alguns problemas simples solucionáveis) com os antigos usos do PyYAML e, como está indicado no link I fornecido, use

from ruamel import yaml

Em vez de

import yaml
E vai resolver a maioria dos teus problemas.

EDIT : PyYAML não está morto como parece, apenas se mantém num lugar diferente.

 2
Author: Oleksandr Zelentsov, 2018-03-20 16:53:26
#!/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:]))
 0
Author: Wojciech Sciesinski, 2017-10-09 14:59:39