YAML, từ viết tắt đệ quy của “YAML Ain't Markup Language”, là ngôn ngữ tuần tự hóa dữ liệu mà con người có thể đọc được. Nó thường được sử dụng cho các tệp cấu hình, nhưng cũng có thể được sử dụng để trao đổi dữ liệu. Trình phân tích cú pháp YAML của python được sử dụng nhiều nhất là PyYAML, một thư viện cho phép bạn tải, phân tích cú pháp và viết YAML, giống như thư viện JSON của Python giúp bạn làm việc với JSON
Bài viết này hướng dẫn bạn cách tải, đọc và ghi các tệp YAML bằng PyYAML. Ngoài ra, bạn sẽ tìm hiểu cách cài đặt nó trên hệ thống của mình và cách YAML so sánh với các lựa chọn thay thế như JSON
Mục lục
YAML là gì?
Theo trang web chính thức [1], YAML là ngôn ngữ tuần tự hóa dữ liệu thân thiện với con người cho tất cả các ngôn ngữ lập trình. YAML thường được sử dụng cho các tệp cấu hình, nhưng nó cũng được sử dụng để trao đổi dữ liệu
YAML rất dễ viết và đọc đối với con người, ngay cả đối với những người không phải là lập trình viên. Đồng thời, cũng dễ dàng phân tích cú pháp YAML, đặc biệt là với Python và thư viện PyYAML. Tính thân thiện với con người và dễ đọc của nó là lợi thế lớn nhất của YAML so với các định dạng khác, như JSON và XML
Đây là những tính năng nổi bật nhất của YAML
- Bạn có thể sử dụng nhận xét trong tệp YAML
- Bạn có thể lưu trữ nhiều tài liệu trong một tệp YAML, với dấu tách
---
. Một tính năng thường được sử dụng trong định nghĩa Kubernetes - Thật dễ dàng để đọc cho con người
- Thật dễ dàng để phân tích cú pháp cho máy tính
1] Sự thật thú vị, trang web YAML chính thức được viết dưới dạng các tệp YAML hợp lệ
Tại sao nên sử dụng YAML với Python?
Nếu bạn hỏi tôi, YAML là lựa chọn hoàn hảo cho các tệp cấu hình. Đó chính xác là cách tôi và nhiều nhà phát triển khác sử dụng nó nhiều nhất. Những người khác dường như đồng ý, vì nhiều dự án lớn, như Docker và Kubernetes, sử dụng YAML để xác định triển khai. Nó có cú pháp phong phú hơn so với cách thay thế thường được sử dụng,. ini, nhưng vẫn đẹp mắt và đơn giản để viết và phân tích cú pháp
Tuy nhiên, có một số nhược điểm khi sử dụng YAML với Python
- YAML không phải là một phần của thư viện Python tiêu chuẩn, trong khi XML và JSON là
- Sự phụ thuộc của nó vào thụt đầu dòng đôi khi gây khó chịu [tuy nhiên, các nhà phát triển Python đã quen với điều đó, phải không?]
- Có lẽ nó hơi quá linh hoạt đối với các trường hợp sử dụng đơn giản, như trao đổi dữ liệu của các đối tượng đơn giản
Nếu bạn đang tìm kiếm một định dạng dữ liệu tốt để trao đổi và lưu trữ dữ liệu, tôi khuyên dùng JSON, XML hoặc các định dạng khác hiệu quả hơn như bộ đệm giao thức và Avro
Cài đặt và nhập PyYAML
Có nhiều gói Python có thể phân tích dữ liệu YAML. Tuy nhiên, PyYAML là triển khai phổ biến nhất và cũng là triển khai đầy đủ nhất để phân tích cú pháp YAML. PyYAML không phải là một phần của thư viện Python tiêu chuẩn, nghĩa là bạn cần cài đặt nó với Pip. Sử dụng lệnh sau để cài đặt PyYAML, tốt hơn là trong môi trường ảo
$ pip install pyyaml
Trên một số hệ thống, bạn cần sử dụng pip3
$ pip3 install pyyaml
Để sử dụng PyYAML trong tập lệnh của bạn, hãy nhập mô-đun như sau. Lưu ý rằng bạn không nhập 'pyyaml' mà chỉ nhập 'yaml'
import yaml
Đọc và phân tích tệp YAML bằng Python
Khi chúng tôi đã nhập trình phân tích cú pháp YAML, chúng tôi có thể tải tệp YAML và phân tích cú pháp tệp đó. Các tệp YAML thường mang phần mở rộng
$ pip3 install pyyaml0 hoặc
$ pip3 install pyyaml1. Hãy làm việc với tệp YAML ví dụ sau, được gọi là
$ pip3 install pyyaml2
rest: url: "//example.org/primenumbers/v1" port: 8443 prime_numbers: [2, 3, 5, 7, 11, 13, 17, 19]
Việc tải, phân tích cú pháp và sử dụng tệp cấu hình này rất giống với việc tải JSON bằng thư viện JSON của Python. Đầu tiên, chúng tôi mở tập tin. Tiếp theo, chúng tôi phân tích cú pháp bằng hàm
$ pip3 install pyyaml3. Xin lưu ý rằng tôi đã thay đổi đầu ra một chút để bạn dễ đọc hơn________số 8_______
Trình phân tích cú pháp YAML trả về một đối tượng Python thông thường phù hợp nhất với dữ liệu. Trong trường hợp này, đó là từ điển Python. Điều này có nghĩa là tất cả các tính năng từ điển thông thường đều có thể được sử dụng, chẳng hạn như sử dụng
$ pip3 install pyyaml4 với giá trị mặc định
Đây là ví dụ tương tự, nhưng có tính tương tác, vì vậy bạn có thể tự mình thử nghiệm điều này
Phân tích chuỗi YAML bằng Python
Bạn có thể sử dụng
$ pip3 install pyyaml3 để phân tích tất cả các loại chuỗi YAML hợp lệ. Đây là một ví dụ phân tích danh sách các mục đơn giản thành danh sách Python
>>> import yaml >>> >>> names_yaml = """ .. - 'eric' .. - 'justin' .. - 'mary-kate' .. """ >>> >>> names = yaml.safe_load[names_yaml] >>> names ['eric', 'justin', 'mary-kate']
Phân tích tệp với nhiều tài liệu YAML
YAML cho phép bạn xác định nhiều tài liệu trong một tệp, phân tách chúng bằng dấu gạch ngang ba lần [---
]. PyYAML cũng sẽ vui vẻ phân tích cú pháp các tệp đó và trả về danh sách tài liệu. Bạn có thể làm như vậy bằng cách sử dụng hàm
$ pip3 install pyyaml7. Hàm này trả về một trình tạo sẽ lần lượt trả về tất cả các tài liệu, từng cái một
Lưu ý rằng tệp cần được mở miễn là bạn đang đọc tài liệu từ YAML, vì vậy bạn phải thực hiện quá trình xử lý của mình trong khoản
$ pip3 install pyyaml8 . Đây là một ví dụ tương tác thể hiện chức năng này
Viết [hoặc kết xuất] YAML vào một tệp
Mặc dù hầu hết sẽ chỉ đọc YAML dưới dạng tệp cấu hình, nhưng cũng có thể rất tiện để viết YAML. Các trường hợp sử dụng ví dụ có thể là
- Tạo một tệp cấu hình ban đầu với các cài đặt hiện tại cho người dùng của bạn
- Để lưu trạng thái chương trình của bạn trong một tệp dễ đọc [thay vì sử dụng thứ gì đó như Pickle]
Trong ví dụ sau, chúng ta sẽ
- Tạo một danh sách có tên như chúng ta đã làm trước đây
- Lưu tên vào tệp có định dạng YAML với
$ pip3 install pyyaml
9 - Đọc và in tệp, làm bằng chứng cho thấy mọi thứ hoạt động như mong đợi
của bạn đây
Đây là mã giống như một ví dụ không tương tác
import yaml names_yaml = """ - 'eric' - 'justin' - 'mary-kate' """ names = yaml.safe_load[names_yaml] with open['names.yaml', 'w'] as file: yaml.dump[names, file] print[open['names.yaml'].read[]]
- eric - justin - mary-kate
Chuyển đổi YAML sang JSON bằng Python
Nếu bạn cần chuyển đổi YAML sang JSON, bạn chỉ cần phân tích cú pháp YAML như chúng tôi đã làm ở trên. Trong bước tiếp theo, bạn có thể sử dụng mô-đun JSON để chuyển đổi đối tượng thành JSON
Trong ví dụ này, chúng tôi mở tệp cấu hình dựa trên YAML, phân tích cú pháp tệp đó bằng PyYAML, sau đó ghi tệp đó vào tệp JSON bằng mô-đun JSON
Đây là mã giống như một ví dụ không tương tác
import yaml import json with open['config.yml', 'r'] as file: configuration = yaml.safe_load[file] with open['config.json', 'w'] as json_file: json.dump[configuration, json_file]
Chuyển đổi JSON sang YAML
Để hoàn thiện, hãy làm ngược lại. chuyển đổi JSON sang YAML
Cách chuyển đổi JSON sang YAML bằng PythonPyYAML safe_load[] so với tải[]
Bạn sẽ bắt gặp nhiều ví dụ về cách sử dụng PyYAML trong đó
import yaml0 được sử dụng thay vì
import yaml1. Tôi cố tình không nói với bạn về chức năng
import yaml0 cho đến bây giờ. Vì hầu hết mọi người đều có việc phải làm và có xu hướng sao chép-dán nhanh một số mã ví dụ, nên tôi muốn họ sử dụng phương pháp phân tích cú pháp YAML an toàn nhất bằng Python
Tuy nhiên, nếu bạn tò mò về sự khác biệt giữa hai điều này, thì đây là bản tóm tắt ngắn.
import yaml0 là một chức năng rất mạnh mẽ, giống như dưa chua, nếu bạn biết chức năng đó. Cả hai đều là những phương pháp rất không an toàn vì chúng cho phép kẻ tấn công thực thi mã tùy ý. Chức năng tải của PyYAML cho phép bạn tuần tự hóa và giải tuần tự hóa các đối tượng Python hoàn chỉnh và thậm chí thực thi mã Python, bao gồm các lệnh gọi đến thư viện
import yaml4, có thể thực thi bất kỳ lệnh nào trên hệ thống của bạn
Trong các phiên bản PyYAML gần đây, hàm
import yaml0 không được dùng nữa và sẽ đưa ra cảnh báo nghiêm trọng khi bạn sử dụng hàm này theo cách không an toàn
Nếu bạn đang phân tích cú pháp các tệp YAML thông thường, giống như 99% chúng tôi làm, thì bạn phải luôn sử dụng
import yaml1, vì nó chỉ chứa một tập hợp con của hàm tải. Tất cả các loại công cụ thực thi mã tùy ý, đáng sợ đều bị loại bỏ