Bagaimana saya bisa mem-parsing file YAML dengan Python?
Bagaimana saya bisa mem-parsing file YAML dengan Python?
Jawaban:
Metode termudah dan paling murni tanpa mengandalkan header C adalah PyYaml ( dokumentasi ), yang dapat diinstal melalui 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)
Dan itu saja. yaml.load()
Fungsi polos juga ada, tetapi yaml.safe_load()
harus selalu lebih disukai kecuali jika Anda secara eksplisit membutuhkan serialisasi objek / deserialisasi objek arbitrer yang disediakan untuk menghindari kemungkinan memperkenalkan eksekusi kode arbitrer.
Catatan proyek PyYaml mendukung versi melalui spesifikasi YAML 1.1 . Jika dukungan spesifikasi YAML 1.2 diperlukan, lihat ruamel.yaml sebagaimana tercantum dalam jawaban ini .
pip install pyyaml
, lihat posting ini untuk opsi lebih lanjut 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
dan .yaml
Untuk aplikasi Anda, berikut ini mungkin penting:
Lihat juga: Perbandingan format serialisasi data
Jika Anda mencari cara untuk membuat file konfigurasi, Anda mungkin ingin membaca artikel pendek saya File konfigurasi dalam Python
€
pada Windows adalah €
. Adakah yang tahu alasannya?
io.open(doc_name, 'r', encoding='utf8')
untuk membaca karakter khusus. YAML versi 0.1.7
open(doc_name, ..., encodung='utf8')
untuk membaca dan menulis, tanpa mengimpor io
.
Jika Anda memiliki YAML yang sesuai dengan spesifikasi YAML 1.2 (dirilis 2009) maka Anda harus menggunakan ruamel.yaml (penafian: Saya pembuat paket itu). Ini pada dasarnya adalah superset dari PyYAML, yang mendukung sebagian besar YAML 1.1 (dari 2005).
Jika Anda ingin dapat mempertahankan komentar Anda saat bolak-balik, Anda tentu harus menggunakan ruamel.yaml.
Meningkatkan contoh @ Jon mudah:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Gunakan safe_load()
kecuali Anda benar-benar memiliki kontrol penuh atas input, membutuhkannya (jarang terjadi) dan tahu apa yang Anda lakukan.
Jika Anda menggunakan pathlib Path
untuk memanipulasi file, Anda lebih baik menggunakan API baru yang disediakan ruamel.yaml:
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)
). Saya sudah mencoba untuk mengatur yaml.encoding ke utf-8 tetapi tidak berfungsi karena metode load di YAML masih menggunakan ascii_decode. Apakah ini bug?
Pertama instal pyyaml menggunakan pip3.
Kemudian impor modul yaml dan muat file ke dalam kamus yang disebut 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Itu yang kamu butuhkan. Sekarang seluruh file yaml ada di kamus 'my_dict'.
!!python
) itu juga bisa tidak aman (seperti dalam harddisk lengkap dihapus bersih) untuk digunakan yaml.load()
. Seperti yang didokumentasikan dengan jelas, Anda harus mengulangi peringatan itu di sini (dalam hampir semua kasus yaml.safe_load()
dapat digunakan).
import yaml
, tetapi itu bukan modul bawaan, dan Anda tidak menentukan paket mana itu. Berjalan import yaml
pada hasil instal Python3 baru diModuleNotFoundError: No module named 'yaml'
Contoh:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Saya menggunakan ruamel.yaml . Detail & debat di sini .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Penggunaan ruamel.yaml kompatibel (dengan beberapa masalah sederhana yang dapat dipecahkan) dengan penggunaan lama PyYAML dan seperti yang dinyatakan dalam tautan yang saya berikan, gunakan
from ruamel import yaml
dari pada
import yaml
dan itu akan memperbaiki sebagian besar masalah Anda.
EDIT : PyYAML tidak mati ternyata, itu hanya dipertahankan di tempat yang berbeda.
#!/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
karena tidak dapat mengeksekusi kode arbitrer dari file YAML.