ฉันจะแยกวิเคราะห์ไฟล์ YAML ใน Python ได้อย่างไร
ฉันจะแยกวิเคราะห์ไฟล์ YAML ใน Python ได้อย่างไร
คำตอบ:
วิธีที่ง่ายและบริสุทธิ์ที่สุดโดยไม่ต้องพึ่งพาส่วนหัว C คือ PyYaml ( เอกสารประกอบ ) ซึ่งสามารถติดตั้งผ่าน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)
และนั่นคือมัน yaml.load()
ฟังก์ชั่นธรรมดายังมีอยู่ แต่yaml.safe_load()
ควรเป็นที่ต้องการเสมอเว้นแต่คุณจะต้องระบุการจัดลำดับวัตถุ / การดีซีเรียลไลเซชันโดยพลการอย่างชัดเจนเพื่อหลีกเลี่ยงการแนะนำความเป็นไปได้สำหรับการใช้รหัสโดยอำเภอใจ
หมายเหตุ PyYaml โครงการสนับสนุนรุ่นขึ้นผ่านข้อกำหนด YAML 1.1 หากจำเป็นต้องมีการสนับสนุนข้อมูลจำเพาะ YAML 1.2ให้ดูruamel.yamlตามที่ระบุไว้ในคำตอบนี้
pip install pyyaml
ดูโพสต์นี้เพื่อดูตัวเลือกเพิ่มเติม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
และ .yaml
สำหรับแอปพลิเคชันของคุณข้อมูลต่อไปนี้อาจสำคัญ:
ดูเพิ่มเติม: การเปรียบเทียบรูปแบบการจัดลำดับข้อมูล
ในกรณีที่คุณกำลังมองหาวิธีสร้างไฟล์การกำหนดค่าคุณอาจต้องการอ่านบทความสั้น ๆ ของฉันไฟล์การตั้งค่าใน Python
€
บน Windows €
คือ ใครรู้เหตุผลหรือไม่
io.open(doc_name, 'r', encoding='utf8')
เพื่ออ่านอักขระพิเศษ YAML เวอร์ชั่น 0.1.7
open(doc_name, ..., encodung='utf8')
io
หากคุณมี YAML ที่สอดคล้องกับข้อกำหนดของYAML 1.2 (เปิดตัวในปี 2009) คุณควรใช้ruamel.yaml (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนแพ็คเกจดังกล่าว) มันคือชุดซูเปอร์เซ็ตของ PyYAML ซึ่งรองรับ YAML 1.1 ส่วนใหญ่ (จากปี 2005)
หากคุณต้องการที่จะรักษาความคิดเห็นของคุณเมื่อมีการปัดเศษคุณควรใช้ ruamel.yaml
ตัวอย่างการอัพเกรด @ Jon นั้นง่าย:
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()
นอกเสียจากว่าคุณจะสามารถควบคุมอินพุตได้อย่างเต็มที่ต้องการมัน (ไม่ค่อยจะใช้ในกรณี) และรู้ว่าคุณกำลังทำอะไรอยู่
หากคุณกำลังใช้ pathlib Path
สำหรับจัดการไฟล์คุณควรใช้ API 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)
) ฉันได้พยายามตั้ง yaml.encoding เป็น utf-8 แต่ไม่ได้ทำงานเนื่องจากวิธีโหลดใน YAML ยังคงใช้ ascii_decode นี่เป็นข้อบกพร่องหรือไม่?
ก่อนติดตั้ง pyyaml โดยใช้ pip3
จากนั้นนำเข้าโมดูล yaml และโหลดไฟล์ลงในพจนานุกรมที่เรียกว่า 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
นั่นคือทั้งหมดที่คุณต้องการ ตอนนี้ไฟล์ yaml ทั้งหมดอยู่ในพจนานุกรม 'my_dict'
!!python
) ก็ยังสามารถเป็นที่ไม่ปลอดภัย (ในขณะที่ harddisc สมบูรณ์เช็ดทำความสะอาด) yaml.load()
เพื่อการใช้งาน ดังที่มีการบันทึกไว้อย่างชัดเจนคุณควรทำซ้ำคำเตือนที่นี่ (ในเกือบทุกกรณีyaml.safe_load()
สามารถใช้ได้)
import yaml
แต่นั่นไม่ใช่โมดูลในตัวและคุณไม่ได้ระบุว่าเป็นแพ็คเกจใด การใช้งานimport yaml
การติดตั้ง Python3 แบบสดใหม่ส่งผลให้ModuleNotFoundError: No module named 'yaml'
ตัวอย่าง:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
ฉันใช้ruamel.yaml รายละเอียดและการอภิปรายที่นี่
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
การใช้งานของruamel.yamlเข้ากันได้ (กับปัญหาที่แก้ไขได้ง่ายบางอย่าง) กับประเพณีเก่าแก่ของ PyYAML และตามที่ระบุไว้ในลิงค์ที่ฉันให้ใช้
from ruamel import yaml
แทน
import yaml
และจะแก้ไขปัญหาส่วนใหญ่ของคุณ
แก้ไข : PyYAML ยังไม่ตายเพราะปรากฎว่าเป็นเพียงการบำรุงรักษาในสถานที่ที่แตกต่างกัน
#!/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