Làm cách nào tôi có thể phân tích cú pháp tệp YAML trong Python?
Làm cách nào tôi có thể phân tích cú pháp tệp YAML trong Python?
Câu trả lời:
Phương pháp đơn giản và thuần túy nhất mà không cần dựa vào tiêu đề C là PyYaml ( tài liệu ), có thể được cài đặt qua 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)
Và đó là nó. Một yaml.load()
hàm đơn giản cũng tồn tại, nhưng yaml.safe_load()
phải luôn luôn được ưu tiên trừ khi bạn rõ ràng cần tuần tự hóa / giải tuần tự hóa đối tượng được cung cấp để tránh đưa ra khả năng thực thi mã tùy ý.
Lưu ý dự án PyYaml hỗ trợ các phiên bản thông qua đặc tả YAML 1.1 . Nếu cần hỗ trợ đặc tả YAML 1.2 , hãy xem ruamel.yaml như đã lưu ý trong câu trả lời này .
pip install pyyaml
, xem bài đăng này để biết thêm tùy chọn stackoverflow.com/questions/14261614/iêu
# -*- 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
và .yaml
Đối với ứng dụng của bạn, những điều sau đây có thể quan trọng:
Xem thêm: So sánh các định dạng tuần tự hóa dữ liệu
Trong trường hợp bạn muốn tìm cách tạo tệp cấu hình, bạn có thể muốn đọc các tệp Cấu hình bài viết ngắn của tôi bằng Python
€
trên Windows là €
. Có ai biết lý do không?
io.open(doc_name, 'r', encoding='utf8')
để đọc ký tự đặc biệt. Phiên bản YAML 0.1.7
open(doc_name, ..., encodung='utf8')
để đọc và viết mà không cần nhập io
.
Nếu bạn có YAML phù hợp với đặc điểm kỹ thuật YAML 1.2 (phát hành năm 2009) thì bạn nên sử dụng ruamel.yaml (từ chối trách nhiệm: Tôi là tác giả của gói đó). Nó thực chất là một superset của PyYAML, hỗ trợ hầu hết YAML 1.1 (từ năm 2005).
Nếu bạn muốn có thể giữ bình luận của mình khi bị vấp, bạn chắc chắn nên sử dụng ruamel.yaml.
Nâng cấp ví dụ của @ Jon rất dễ dàng:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Sử dụng safe_load()
trừ khi bạn thực sự có toàn quyền kiểm soát đầu vào, cần nó (hiếm khi xảy ra trường hợp) và biết bạn đang làm gì.
Nếu bạn đang sử dụng pathlib Path
để thao tác các tệp, bạn nên sử dụng API mới ruamel.yaml cung cấp:
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)
). Tôi đã cố gắng đặt yaml.encoding thành utf-8 nhưng không hoạt động vì phương thức tải trong YAML vẫn sử dụng mã ascii_decode. Đây có phải là một lỗi?
Đầu tiên cài đặt pyyaml bằng pip3.
Sau đó nhập mô-đun yaml và tải tệp vào một từ điển có tên 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Đó là tất cả những gì bạn cần. Bây giờ toàn bộ tệp yaml nằm trong từ điển 'my_dict'.
!!python
), nó cũng có thể không an toàn (như trong đĩa cứng hoàn toàn bị xóa sạch) để sử dụng yaml.load()
. Vì đó là tài liệu rõ ràng, bạn nên lặp lại cảnh báo đó ở đây (trong hầu hết các trường hợp yaml.safe_load()
có thể được sử dụng).
import yaml
, nhưng đó không phải là mô-đun tích hợp và bạn không chỉ định gói đó là gì. Chạy import yaml
trên bản cài đặt Python3 mới cho kết quảModuleNotFoundError: No module named 'yaml'
Thí dụ:
mặc định.yaml
url: https://www.google.com
môi trường
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Tôi sử dụng ruamel.yaml . Chi tiết & tranh luận tại đây .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Cách sử dụng ruamel.yaml tương thích (với một số vấn đề có thể giải quyết đơn giản) với cách sử dụng cũ của PyYAML và như đã nêu trong liên kết tôi đã cung cấp, hãy sử dụng
from ruamel import yaml
thay vì
import yaml
và nó sẽ khắc phục hầu hết các vấn đề của bạn.
EDIT : PyYAML không chết vì hóa ra, nó chỉ được duy trì ở một nơi khác.
#!/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
vì nó không thể thực thi mã tùy ý từ tệp YAML.