Como posso analisar um arquivo YAML no Python?
Como posso analisar um arquivo YAML no Python?
Respostas:
O método mais fácil e puro, sem depender dos cabeçalhos C, é o PyYaml ( documentação ), que pode ser instalado via pip install pyyaml
:
#!/usr/bin/env python
import yaml
import json
with open("example.yaml", 'r') as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
E é isso. Uma yaml.load()
função simples também existe, mas yaml.safe_load()
sempre deve ser preferida, a menos que você precise explicitamente da serialização / desserialização arbitrária de objetos fornecida para evitar a introdução da possibilidade de execução arbitrária de código.
Observe que o projeto PyYaml suporta versões através da especificação YAML 1.1 . Se o suporte à especificação YAML 1.2 for necessário, consulte ruamel.yaml, conforme observado nesta resposta .
pip install pyyaml
, consulte esta publicação para obter mais opções stackoverflow.com/questions/14261614/…
# -*- 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)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
e .yaml
Para seu aplicativo, o seguinte pode ser importante:
Consulte também: Comparação de formatos de serialização de dados
Caso você esteja procurando uma maneira de criar arquivos de configuração, leia meu pequeno artigo Arquivos de configuração em Python
€
Windows é €
. Alguém sabe o motivo?
io.open(doc_name, 'r', encoding='utf8')
para ler o caractere especial. YAML versão 0.1.7
open(doc_name, ..., encodung='utf8')
para leitura e gravação, sem importar io
.
Se você possui o YAML que está em conformidade com a especificação YAML 1.2 (lançada em 2009), use ruamel.yaml (isenção de responsabilidade: sou o autor desse pacote). É essencialmente um superconjunto do PyYAML, que suporta a maior parte do YAML 1.1 (de 2005).
Se você quiser preservar seus comentários ao percorrer o caminho, certamente deve usar o ruamel.yaml.
A atualização do exemplo de 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)
Use a safe_load()
menos que você realmente tenha controle total sobre a entrada, precise dela (raramente é o caso) e saiba o que está fazendo.
Se você estiver usando o pathlib Path
para manipular arquivos, é melhor usar a nova API que o ruamel.yaml fornece:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
). Eu tentei definir yaml.encoding como utf-8, mas não funcionou, pois o método de carregamento no YAML ainda usa o ascii_decode. Isso é um inseto?
Primeiro instale o pyyaml usando o pip3.
Em seguida, importe o módulo yaml e carregue o arquivo em um dicionário chamado 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
É tudo o que você precisa. Agora, o arquivo yaml inteiro está no dicionário 'my_dict'.
!!python
), também poderá ser inseguro (como no disco rígido completo limpo) yaml.load()
. Como isso está claramente documentado, você deve repetir esse aviso aqui (em quase todos os casos yaml.safe_load()
podem ser usados).
import yaml
, mas esse não é um módulo interno e não especifica qual pacote é. A execução import yaml
em uma nova instalação do Python3 resulta emModuleNotFoundError: No module named 'yaml'
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)
O uso do ruamel.yaml é compatível (com alguns problemas simples solucionáveis) com os usos antigos do PyYAML e, conforme indicado no link fornecido, use
from ruamel import yaml
ao invés de
import yaml
e corrigirá a maioria dos seus problemas.
EDIT : PyYAML não está morto como se vê, apenas é mantido em um 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:]))
yaml.safe_load
lo, pois ele não pode executar código arbitrário do arquivo YAML.