2011-08-31 7 views
29

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ể loaddump dữ liệu này trong khi duy trì bình luận?

+1

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. –

Trả lời

11

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).

+1

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

38

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 listdict 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

+2

Đây phải là câu trả lời được chấp nhận. – bram

+0

Đ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

+2

@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

0

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.