1. YAML là gì?
Tổng quan về YAML
YAML (YAML Ain’t Markup Language) là một trong những định dạng tuần tự hóa dữ liệu, được sử dụng rộng rãi để biểu diễn dữ liệu có cấu trúc. YAML tương tự như JSON hay XML, nhưng đặc trưng nổi bật là sự đơn giản và khả năng dễ đọc. Đặc biệt, YAML biểu diễn cấu trúc phân cấp bằng thụt lề, giúp con người dễ dàng đọc và hiểu.
Sự khác biệt so với JSON và XML
JSON và XML cũng được dùng để mô tả dữ liệu, nhưng YAML có ít ký hiệu dư thừa hơn, đơn giản và dễ hiểu hơn. Ví dụ, JSON sử dụng nhiều dấu ngoặc nhọn {}
và dấu phẩy ,
, điều này làm giảm tính trực quan khi xử lý dữ liệu lớn. Trong khi đó, YAML dùng thụt lề để biểu diễn cấu trúc, giúp người đọc dễ dàng nắm bắt phân cấp dữ liệu.
Tính tương thích tốt với Python
Cú pháp Python đặc trưng bởi việc sử dụng thụt lề để xác định khối lệnh, điều này rất tương đồng với định dạng YAML. Ngoài ra, với thư viện “PyYAML”, bạn có thể dễ dàng đọc và ghi các tệp YAML trong Python, thường được sử dụng để quản lý file cấu hình.

2. Cách đọc và ghi tệp YAML trong Python
Đọc tệp YAML
Để đọc tệp YAML bằng Python, trước tiên cần cài đặt thư viện “PyYAML” và sử dụng hàm yaml.safe_load()
. Hàm này sẽ chuyển đổi dữ liệu YAML thành dictionary hoặc list trong Python một cách an toàn. Ví dụ cơ bản như sau:
import yaml
# Mở và đọc nội dung tệp YAML
with open('config.yaml', 'r') as file:
data = yaml.safe_load(file)
print(data)
Đoạn mã này sẽ đọc dữ liệu từ tệp YAML và lưu vào dictionary của Python. Ví dụ với tệp YAML sau:
database:
host: localhost
port: 3306
Kết quả trong Python sẽ là:
{'database': {'host': 'localhost', 'port': 3306}}
Ghi dữ liệu vào tệp YAML
Để ghi dữ liệu Python sang YAML, dùng hàm yaml.dump()
. Ví dụ sau đây ghi dictionary Python vào một file YAML:
import yaml
data = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
}
with open('output.yaml', 'w') as file:
yaml.dump(data, file)
Kết quả xuất ra trong tệp output.yaml
sẽ là:
age: 30
city: New York
name: John Doe
Xử lý tiếng Nhật và Unicode
Khi làm việc với YAML chứa tiếng Nhật hoặc các ngôn ngữ có ký tự đặc biệt, nên dùng tùy chọn allow_unicode=True
để tránh lỗi hiển thị ký tự.
yaml.dump(data, file, allow_unicode=True)

3. Các thao tác nâng cao với YAML
Tạo thẻ tùy chỉnh
YAML không chỉ hỗ trợ các kiểu dữ liệu cơ bản (list, dictionary) mà còn có thể tuần tự hóa và giải tuần tự hóa đối tượng Python. Trong trường hợp này, bạn có thể sử dụng thẻ tùy chỉnh. Ví dụ sau minh họa cách lưu một lớp Python dưới dạng YAML:
import yaml
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def person_representer(dumper, data):
return dumper.represent_mapping('!Person', {'name': data.name, 'age': data.age})
def person_constructor(loader, node):
values = loader.construct_mapping(node)
return Person(values['name'], values['age'])
yaml.add_representer(Person, person_representer)
yaml.add_constructor('!Person', person_constructor)
# Chuyển đối tượng sang YAML và lưu lại
person = Person('Alice', 25)
with open('person.yaml', 'w') as file:
yaml.dump(person, file)
# Tái tạo đối tượng từ tệp YAML
with open('person.yaml', 'r') as file:
loaded_person = yaml.load(file, Loader=yaml.FullLoader)
Như vậy, bạn có thể lưu đối tượng Python dưới dạng YAML và tái sử dụng sau này.
Giữ nguyên thứ tự
Trong PyYAML, thứ tự của các key trong dictionary mặc định không được giữ lại. Nếu bạn cần bảo toàn thứ tự, nên dùng ruamel.yaml
. Thư viện này duy trì thứ tự key, rất hữu ích khi xử lý các tệp cấu hình yêu cầu tính chính xác cao về thứ tự.

4. Ứng dụng YAML: Quản lý tệp cấu hình
Lợi ích khi dùng YAML làm tệp cấu hình
YAML thường được sử dụng để quản lý file cấu hình. Trong các ứng dụng Python, YAML giúp quản lý dữ liệu cấu hình dễ dàng nhờ khả năng hiển thị trực quan và dễ đọc. Ví dụ, bạn có thể quản lý thông tin kết nối cơ sở dữ liệu hoặc cấu hình logging:
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
Với YAML, nhiều cấu hình có thể được mô tả ngắn gọn và dễ hiểu.
Ví dụ trong các dự án thực tế
YAML được dùng trong nhiều framework và công cụ như Django, Flask, CircleCI, Kubernetes. Chủ yếu trong quản lý cấu hình và định nghĩa biến môi trường.
Ví dụ dùng YAML trong Django:
import yaml
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': config['database']['name'],
'USER': config['database']['username'],
'PASSWORD': config['database']['password'],
'HOST': config['database']['host'],
'PORT': config['database']['port'],
}
}
So sánh với JSON và XML
So với JSON và XML, YAML trực quan và dễ đọc hơn. JSON sử dụng nhiều dấu ngoặc và dấu phẩy, còn XML yêu cầu thẻ mở/đóng gây dư thừa. YAML thì biểu diễn cấu trúc bằng thụt lề nên dễ hiểu hơn.
So sánh JSON và YAML:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "user",
"password": "pass"
},
"logging": {
"level": "DEBUG",
"file": "/var/log/app.log"
}
}
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
Rõ ràng YAML đơn giản và dễ đọc hơn JSON.

5. Xử lý sự cố và quản lý lỗi
Các lỗi thường gặp và cách khắc phục
Một số lỗi phổ biến khi làm việc với tệp YAML là “tệp không tồn tại” hoặc “tệp không đúng định dạng”. Các lỗi này có thể được xử lý bằng cách triển khai cơ chế quản lý lỗi phù hợp.
Ví dụ, khi xảy ra lỗi phân tích cú pháp YAML, bạn có thể bắt ngoại lệ bằng yaml.YAMLError
. Nếu tệp không tồn tại, có thể xử lý bằng FileNotFoundError
để đưa ra thông báo hợp lý cho người dùng.
import yaml
def load_yaml(file_path):
try:
with open(file_path, 'r') as file:
data = yaml.safe_load(file)
except FileNotFoundError:
print(f"Error: The file {file_path} does not exist.")
return None
except yaml.YAMLError as e:
print(f"Error: Failed to parse YAML file. {e}")
return None
return data
config = load_yaml('config.yaml')
if config:
print(config)
Thực hành tốt trong xử lý lỗi
- Kiểm tra sự tồn tại của tệp: Xác minh tệp có tồn tại hay không và thông báo nếu không tìm thấy.
- Xử lý lỗi phân tích cú pháp: Nếu cú pháp YAML sai, bắt lỗi và cung cấp thông báo chi tiết.
- Ghi log: Khi có lỗi, ghi lại thông báo vào log file để dễ dàng xử lý sự cố sau này.
6. Kết luận
YAML là định dạng tuần tự hóa dữ liệu nổi bật với sự đơn giản và khả năng dễ đọc. Trong Python, việc đọc và ghi YAML rất dễ dàng, giúp quản lý file cấu hình hiệu quả. YAML cũng hỗ trợ các tính năng nâng cao như thẻ tùy chỉnh, tuần tự hóa lớp, và giữ nguyên thứ tự key, mang lại sự linh hoạt trong quản lý cấu hình.
Việc sử dụng YAML không chỉ giới hạn ở quản lý cấu hình mà còn phổ biến trong nhiều dự án lưu trữ dữ liệu khác. YAML hứa hẹn sẽ tiếp tục được áp dụng rộng rãi trong nhiều lĩnh vực phát triển phần mềm.