Python'da bir YAML dosyasını nasıl ayrıştırabilirim?
Python'da bir YAML dosyasını nasıl ayrıştırabilirim?
Yanıtlar:
C başlıklarına dayanmadan en kolay ve en saf yöntem PyYaml'dir ( belgeler ) pip install pyyaml
:
#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Ve bu kadar. Düz bir yaml.load()
işlev de vardır, ancak yaml.safe_load()
rastgele kod yürütme olasılığını getirmekten kaçınmak için açıkça keyfi nesne serileştirmesi / serileştirmesi gerekmedikçe her zaman tercih edilmelidir.
PyYaml projesinin YAML 1.1 spesifikasyonu üzerinden sürümleri desteklediğini unutmayın . Eğer YAML 1.2 spesifikasyonu destek gerekirse, bkz ruamel.yaml belirtildiği gibi bu cevap .
pip install pyyaml
, daha fazla seçenek için bu gönderiye bakın 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
ve .yaml
Başvurunuz için aşağıdakiler önemli olabilir:
Ayrıca bkz: Veri serileştirme formatlarının karşılaştırılması
Yapılandırma dosyaları oluşturmanın bir yolunu arıyorsanız , Python'daki yapılandırma dosyamdaki kısa makalemi okumak isteyebilirsiniz.
€
Windows üzerinde olduğunu €
. Sebebini bilen var mı?
io.open(doc_name, 'r', encoding='utf8')
Özel karakteri okumak için kod satırını değiştirmek zorunda kaldım . YAML sürüm 0.1.7
open(doc_name, ..., encodung='utf8')
Yerleşiki, içe aktarmadan okuma ve yazma için kullanabilirsiniz io
.
YAML 1.2 şartnamesine (2009'da piyasaya sürülen) uyan YAML varsa, ruamel.yaml kullanmalısınız (feragatname: Ben bu paketin yazarıyım ). Aslında, YAML 1.1'in çoğunu (2005'ten itibaren) destekleyen PyYAML'in bir üst kümesidir.
Yuvarlak açma sırasında yorumlarınızı korumak istiyorsanız, kesinlikle ruamel.yaml kullanmalısınız.
@ Jon'un örneğini yükseltmek kolaydır:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
safe_load()
Giriş üzerinde tam kontrole sahip olmadığınız sürece kullanın (buna nadiren ihtiyaç duyarsınız) ve ne yaptığınızı bilin.
Path
Dosyaları işlemek için pathlib kullanıyorsanız, yeni ruamel.yaml API'sini kullanmak daha iyidir:
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)
). Utf-8 için yaml.encoding ayarlamaya çalıştım ama YAML yükleme yöntemi hala ascii_decode kullanır gibi çalışmadı. Bu bir hata mı?
İlk önce pip3 kullanarak pyyaml yükleyin.
Ardından yaml modülünü içe aktarın ve dosyayı 'my_dict' adlı sözlüğe yükleyin:
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Tek ihtiyacınız olan bu. Şimdi yaml dosyasının tamamı 'my_dict' sözlüğünde.
!!python
) kullanmak da güvenli olmayabilir (tam sabit disk temizliğinde olduğu gibi) yaml.load()
. Bu açıkça belgelendiğinden, bu uyarıyı burada tekrar etmelisiniz (hemen hemen tüm durumlarda yaml.safe_load()
kullanılabilir).
import yaml
, ancak bu yerleşik bir modül değil ve hangi paket olduğunu belirtmiyorsunuz. import yaml
Taze bir Python3 kurulum sonuçları üzerinde çalışanModuleNotFoundError: No module named 'yaml'
Misal:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Kullandığım ruamel.yaml . Detaylar ve tartışma burada .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Kullanımı ruamel.yaml PyYAML eski kullanımlar ile (bazı basit çözülebilir sorunları olan) uyumludur ve bu, bağlantıya belirtildiği gibi, kullanımı sağlanır
from ruamel import yaml
onun yerine
import yaml
ve sorunlarınızın çoğunu çözecektir.
EDIT : PyYAML ortaya çıktığı gibi ölmedi, sadece farklı bir yerde tutulur.
#!/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
, YAML dosyasından rasgele kod yürütmek gibi kullanmak daha iyi olduğunu eklemek istiyorum .