Phân tích cú pháp tệp YAML bằng Python và truy cập dữ liệu?


83

Tôi mới sử dụng YAML và đang tìm cách phân tích cú pháp tệp YAML và sử dụng / truy cập dữ liệu từ YAML đã phân tích cú pháp.

Tôi đã xem qua các giải thích về cách phân tích cú pháp tệp YAML, ví dụ: hướng dẫn PyYAML , " Làm cách nào để phân tích cú pháp tệp YAML trong Python ", " Chuyển đổi Python dict thành đối tượng? ", Nhưng điều tôi chưa tìm thấy là ví dụ đơn giản về cách truy cập dữ liệu từ tệp YAML đã được phân tích cú pháp.

Giả sử tôi có một tệp YAML chẳng hạn như:

 treeroot:
     branch1: branch1 text
     branch2: branch2 text

Làm cách nào để truy cập văn bản "văn bản nhánh1"?

" Phân tích cú pháp YAML và Python? " Cung cấp một giải pháp, nhưng tôi gặp sự cố khi truy cập dữ liệu từ một tệp YAML phức tạp hơn. Và, tôi đang tự hỏi liệu có một cách chuẩn nào đó để truy cập dữ liệu từ tệp YAML đã được phân tích cú pháp, có thể là một cái gì đó tương tự như ký hiệu " lặp cây " hoặc " đường dẫn phần tử " hoặc một cái gì đó sẽ được sử dụng khi phân tích cú pháp tệp XML không?


Câu trả lời:


151

Vì hàm của PyYAML yaml.load()phân tích cú pháp tài liệu YAML thành cấu trúc dữ liệu Python nguyên bản, bạn chỉ có thể truy cập các mục bằng khóa hoặc chỉ mục. Sử dụng ví dụ từ câu hỏi bạn đã liên kết:

import yaml
with open('tree.yaml', 'r') as f:
    doc = yaml.load(f)

Để truy cập, branch1 textbạn sẽ sử dụng:

txt = doc["treeroot"]["branch1"]
print txt
"branch1 text"

bởi vì, trong tài liệu YAML của bạn, giá trị của branch1khóa nằm dưới treerootkhóa.


3
Tôi nhận được "TypeError: chỉ số chuỗi phải là số nguyên, không phải str". Có vẻ như tôi không thể sử dụng chuỗi cho chỉ mục.
sattu

Có thể bạn đang cố gắng truy cập (lập chỉ mục vào) một chuỗi. Bạn có thể đã đi quá sâu; bạn đã ở phần tử bạn đang cố gắng truy cập chưa?
Aphex

@sattu tôi đã có lỗi tương tự vì tôi không có bất kỳ không gian giữa khóa và giá trị, tức là "labelsize: 20" thay vì "labelsize: 20"
mateuszb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.