Jak mogę przetworzyć plik YAML w Pythonie
Jak mogę przetworzyć plik YAML w Pythonie?
7 answers
Najprostszą i czystą metodą bez polegania na nagłówkach C jest 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)
I to wszystko. Więcej informacji tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 16:13:44
Odczyt i zapis plików YAML za pomocą Pythona 2+3 (i 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)
Utworzony plik YAML
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
Wspólne zakończenia plików
.yml
i .yaml
Alternatywy
- CSV: Super simple format ( read & write ) JSON: dobry do pisania danych czytelnych dla człowieka; bardzo często używany (read & write )
- YAML: YAML jest supersetem JSON, ale łatwiejszym do odczytania (read & write, porównanie JSON i YAML )
- pickle: a Python serialization format (read & write)
- MessagePack (Python package): bardziej zwarta reprezentacja (read & write)
- HDF5 (Python package): Nice for matrices (read & write)
- XML: exists too * sigh* (read & napisz )
Dla Twojej aplikacji, Następujące mogą być ważne:
- wsparcie przez inne języki programowania
- wydajność odczytu / zapisu
- zwartość (Rozmiar pliku)
Zobacz także: porównanie formatów serializacji danych
Jeśli szukasz sposobu na tworzenie plików konfiguracyjnych, możesz przeczytać mój krótki artykuł pliki konfiguracyjne w Pythonie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38
Jeśli posiadasz YAML zgodny ze specyfikacją YAML 1.2 (wydaną w 2009 roku), powinieneś użyć ruamel.yaml (zastrzeżenie: jestem autorem tego pakietu). Jest to zasadniczo superset PyYAML, który obsługuje większość YAML 1.1 (od 2005).
Jeśli chcesz być w stanie zachować swoje komentarze podczas round-potknięcia, z pewnością należy użyć ruamel.yaml.
Ulepszenie przykładu @Jona jest proste:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Użyj safe_load()
, chyba że naprawdę masz pełną kontrolę nad wejściem, trzeba go (rzadko przypadek) i wiedzieć, co robisz.
Jeśli używasz pathlib Path
do manipulowania plikami, lepiej jest użyć nowego API ruamel.yaml zapewnia:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 17:12:55
Zaimportuj moduł yaml i Załaduj plik do słownika o nazwie 'my_dict':
import yaml
my_dict = yaml.load(open('filename'))
To wszystko, czego potrzebujesz. Teraz cały plik yaml znajduje się w słowniku' my_dict'.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 03:18:51
Przykład:
Defaults.yaml
url: https://www.google.com
Environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-20 07:41:44
Używam ruamel.yaml . szczegóły i dyskusja tutaj.
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Użycie ruamel.yaml jest kompatybilny (z prostymi rozwiązywalnymi problemami) ze starymi używkami PyYAML i jak to jest powiedziane w linku, który podałem, użyj
from ruamel import yaml
Zamiast
import yaml
I rozwiąże większość twoich problemów.
EDIT : PyYAML nie jest martwy jak się okazuje, jest po prostu utrzymywany w innym miejscu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
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:]))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 14:59:39