Come posso analizzare un file YAML in Python?
Come posso analizzare un file YAML in Python?
Risposte:
Il metodo più semplice e puro senza fare affidamento sulle intestazioni C è PyYaml ( documentazione ), che può essere installato tramite 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 questo è tutto. yaml.load()
Esiste anche una funzione semplice , ma yaml.safe_load()
dovrebbe essere sempre preferita a meno che non sia esplicitamente necessaria la serializzazione / deserializzazione arbitraria degli oggetti fornita per evitare di introdurre la possibilità di eseguire codice arbitrario.
Si noti che il progetto PyYaml supporta le versioni fino alla specifica YAML 1.1 . Se è necessario il supporto delle specifiche YAML 1.2 , vedere ruamel.yaml come indicato in questa risposta .
pip install pyyaml
, vedere questo post per ulteriori opzioni 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
Per la tua applicazione, potrebbe essere importante quanto segue:
Vedi anche: Confronto dei formati di serializzazione dei dati
Nel caso in cui tu stia cercando un modo per creare file di configurazione, potresti voler leggere il mio breve articolo File di configurazione in Python
€
su Windows è €
. Qualcuno sa il motivo?
io.open(doc_name, 'r', encoding='utf8')
per leggere il carattere speciale. Versione YAML 0.1.7
open(doc_name, ..., encodung='utf8')
per leggere e scrivere, senza importare io
.
Se hai YAML conforme alla specifica YAML 1.2 (rilasciata nel 2009), dovresti usare ruamel.yaml (dichiarazione di non responsabilità: sono l'autore di quel pacchetto). È essenzialmente un superset di PyYAML, che supporta la maggior parte di YAML 1.1 (dal 2005).
Se vuoi essere in grado di conservare i tuoi commenti durante il round trip, dovresti sicuramente usare ruamel.yaml.
Aggiornare l'esempio di Jon è semplice:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Usa a safe_load()
meno che tu non abbia davvero il pieno controllo dell'input, ne abbia bisogno (raramente il caso) e sappia cosa stai facendo.
Se si utilizza pathlib Path
per manipolare i file, è meglio utilizzare la nuova API ruamel.yaml che fornisce:
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)
). Ho provato a impostare yaml.encoding su utf-8 ma non ha funzionato poiché il metodo di caricamento in YAML utilizza ancora ascii_decode. è un insetto?
Prima installa pyyaml usando pip3.
Quindi importare il modulo yaml e caricare il file in un dizionario chiamato 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Questo è tutto ciò di cui hai bisogno. Ora l'intero file yaml è nel dizionario 'my_dict'.
!!python
) può anche non essere sicuro (come nel caso del disco fisso completo cancellato) da usare yaml.load()
. Dato che ciò è chiaramente documentato, avresti dovuto ripetere questo avviso qui (in quasi tutti i casi yaml.safe_load()
può essere utilizzato).
import yaml
, ma questo non è un modulo integrato e non specifichi quale pacchetto sia. L'esecuzione import yaml
su una nuova installazione di Python3 si traduce inModuleNotFoundError: No module named 'yaml'
Esempio:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Uso ruamel.yaml . Dettagli e dibattito qui .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
L'uso di ruamel.yaml è compatibile (con alcuni semplici problemi risolvibili) con vecchi usi di PyYAML e come indicato nel link che ho fornito, utilizzare
from ruamel import yaml
invece di
import yaml
e risolverà la maggior parte dei tuoi problemi.
EDIT : PyYAML non è morto come risulta, è solo mantenuto in un posto diverso.
#!/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
quanto non è possibile eseguire codice arbitrario dal file YAML.