Como posso processar um ficheiro YAML em Python
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:
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
- CSV: formato Super simples ( ler e escrever)
- JSON: bom para escrever dados legíveis por humanos; muito usado ( leia & escreva)
- YAML: YAML é um super-conjunto de JSON, mas mais fácil de ler ( ler e escrever, comparação entre a JSON e a YAML)
- pickle: um formato de serialização em Python (ler e escrever)
- MessagePack (pacote Python ): representação mais compacta ( ler e escrever)
- HDF5 (pacote Python ): bom para matrizes ( ler e escrever)
- XML: existe também * sigh* (leia & escrever)
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
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)
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'.
Exemplo:
Defaults.yaml
url: https://www.google.com
Environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
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.
#!/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:]))