Tôi có một tập tin yaml trông như thế này:Save/đổ một file YAML với ý kiến trong PyYAML
# The following key opens a door
key: value
Có cách nào tôi có thể load
và dump
dữ liệu này trong khi duy trì bình luận?
Tôi có một tập tin yaml trông như thế này:Save/đổ một file YAML với ý kiến trong PyYAML
# The following key opens a door
key: value
Có cách nào tôi có thể load
và dump
dữ liệu này trong khi duy trì bình luận?
PyYAML ném nhận xét ở mức rất thấp (trong Scanner.scan_to_next_token
).
Mặc dù bạn có thể điều chỉnh hoặc mở rộng để xử lý các nhận xét trong toàn bộ ngăn xếp, đây sẽ là một sửa đổi lớn. Dump
ing (= phát ra) ý kiến có vẻ dễ dàng hơn và đã được thảo luận trong ticket 114 trên trình theo dõi lỗi PyYAML cũ. Rất tiếc, các vé cũ chưa được lưu trữ (và archive.org search hiện bị hỏng).
Bạn đúng, đó là một sửa đổi lớn, mặc dù dễ dàng hơn vì tôi đã giảm <2.6 hỗ trợ và kết hợp lại các nguồn Py2 và Py3. – Anthon
Nếu bạn đang sử dụng khối cấu trúc YAML, bạn có thể sử dụng python package¹ ruamel.yaml đó là một dẫn xuất của PyYAML và hỗ trợ bảo quản khứ hồi ý kiến :
import sys
import ruamel.yaml
yaml_str = """\
# example
name:
# details
family: Smith # very common
given: Alice # one of the siblings
"""
code = ruamel.yaml.round_trip_load(yaml_str)
code['name']['given'] = 'Bob'
ruamel.yaml.round_trip_dump(code, sys.stdout)
với kết quả:
# example
name:
# details
family: Smith # very common
given: Bob # one of the siblings
Lưu ý rằng các nhận xét cuối dòng vẫn được căn chỉnh.
Thay vì bình thường list
và dict
các đối tượng code
bao gồm các phiên bản được bao gói² mà các nhận xét được đính kèm.
¹ Cài đặt với pip install ruamel.yaml
. Hoạt động trên Python 2,6/2,7/3,3 +
² ordereddict
được sử dụng trong trường hợp của một ánh xạ, để bảo tồn đặt hàng
Đây phải là câu trả lời được chấp nhận. – bram
Điều này không trả lời câu hỏi của OP. Nó bảo quản trật tự, nhưng không bảo lưu. – Cerin
@cerin Nhận xét nào bị thiếu khi bạn chạy mã trên? Với phiên bản Python, ruamel.yaml và trên nền tảng nào bạn đã chạy mã này? Tôi chỉ thử lại với phiên bản mới nhất của ruamel.yaml (trong trường hợp tôi đã phá vỡ một cái gì đó) và đầu ra vẫn bao gồm các bình luận. Với số lượng upvotes ở đây, tôi nghĩ rằng những người khác đã có thể có được kết quả tương tự, và rằng bạn có thể đã bỏ qua một cái gì đó. – Anthon
Tôi đã một chi nhánh của pyyaml thực hiện chính xác này. https://github.com/pflarr/pyyaml
Để tạo tệp yaml có nhận xét, bạn phải tạo luồng sự kiện bao gồm các sự kiện nhận xét. Nhận xét hiện chỉ được phép trước các mục trình tự và các phím ánh xạ.
Điều này hiện chỉ hoạt động cho python3, tôi chưa chuyển nó sang phiên bản python2 của thư viện, nhưng có thể dễ dàng thực hiện theo yêu cầu. Ngoài ra, điều này cũng nên được khá dễ dàng để cổng đến libyaml C là tốt, như mã python là một cổng đơn giản của anyway.
Tôi đã từng sửa đổi mã libyaml C để phát ra nhận xét cho mục đích sử dụng của riêng tôi. Mở rộng này để PyYAML sẽ không được dễ dàng. –