Bagaimana saya bisa mem-parsing file YAML dengan Python?
611
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 .
yaml.safe_load
karena tidak dapat mengeksekusi kode arbitrer dari file YAML.pip install pyyaml
, lihat posting ini untuk opsi lebih lanjut stackoverflow.com/questions/14261614/…Baca & Tulis file YAML dengan Python 2 + 3 (dan unicode)
File YAML dibuat
Ujung file umum
.yml
dan.yaml
Alternatif
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
sumber
€
pada Windows adalah€
. Adakah yang tahu alasannya?io.open(doc_name, 'r', encoding='utf8')
untuk membaca karakter khusus. YAML versi 0.1.7open(doc_name, ..., encodung='utf8')
untuk membaca dan menulis, tanpa mengimporio
.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:
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:sumber
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':
Itu yang kamu butuhkan. Sekarang seluruh file yaml ada di kamus 'my_dict'.
sumber
!!python
) itu juga bisa tidak aman (seperti dalam harddisk lengkap dihapus bersih) untuk digunakanyaml.load()
. Seperti yang didokumentasikan dengan jelas, Anda harus mengulangi peringatan itu di sini (dalam hampir semua kasusyaml.safe_load()
dapat digunakan).import yaml
, tetapi itu bukan modul bawaan, dan Anda tidak menentukan paket mana itu. Berjalanimport yaml
pada hasil instal Python3 baru diModuleNotFoundError: No module named 'yaml'
Contoh:
sumber
Saya menggunakan ruamel.yaml .
Detail & debat di sini.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
dari pada
dan itu akan memperbaiki sebagian besar masalah Anda.
EDIT : PyYAML tidak mati ternyata, itu hanya dipertahankan di tempat yang berbeda.
sumber
sumber