Jak mogę przetworzyć plik YAML w Pythonie

Jak mogę przetworzyć plik YAML w Pythonie?

 363
Author: Omer Dagan, 2009-11-21

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:

Http://pyyaml.org/wiki/PyYAMLDocumentation

 502
Author: Jon,
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

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

 35
Author: Martin Thoma,
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)
 32
Author: Anthon,
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'.
 12
Author: Pal,
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']
 4
Author: Prashanth Sams,
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.

 2
Author: Oleksandr Zelentsov,
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:]))
 0
Author: Wojciech Sciesinski,
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