Giới thiệu
Khi làm việc với log hoặc dữ liệu có định dạng cố định, cần trích xuất các trường (fields) cụ thể. Bài viết giới thiệu 2 phương pháp: tách chuỗi thủ công và dùng thư viện parse.
Định dạng log mẫu
Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland
Phương pháp 1: Tách chuỗi thủ công (split)
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
# Bước 1: Tách theo delimiter " - "
fields = report.split(' - ')
# ['Report: Daily_Report', 'Time: 2020-10-10T12:30:59.000000',
# 'Player: Federer', 'Titles: 20', 'Country: Switzerland']
name, time, player, titles, _ = fields
# Bước 2: Trích xuất giá trị sau dấu ":"
formatted_name = name.split(':')[1].strip() # 'Daily_Report'
formatted_player = player.split(':')[1].strip() # 'Federer'
formatted_titles = int(titles.split(':')[1].strip()) # 20
formatted_time = time.split(': ', 1)[1] # '2020-10-10T12:30:59.000000'
print(f'{formatted_name}, {formatted_time}, {formatted_player}, {formatted_titles}')
# Daily_Report, 2020-10-10T12:30:59.000000, Federer, 20
Phương pháp 2: Parse timestamp ISO
from datetime import datetime
dt = datetime.fromisoformat(formatted_time)
print(dt) # 2020-10-10 12:30:59
Hàm gộp hoàn chỉnh
def parse_log(log):
fields = log.split(' - ')
name, time, player, titles, _ = fields
return (
name.split(':')[1].strip(),
time.split(': ', 1)[1],
player.split(':')[1].strip(),
int(titles.split(':')[1].strip())
)
# Test
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
print(parse_log(report))
# ('Daily_Report', '2020-10-10T12:30:59.000000', 'Federer', 20)
Phương pháp 3: Thư viện parse (khuyên dùng)
Cài đặt: pip install parse
from parse import parse
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
# Định nghĩa template với placeholder {field}
template = 'Report: {name} - Time: {time} - Player: {player} - Titles: {titles} - Country: {country}'
result = parse(template, report)
print(result)
#
# Truy cập từng trường
print(f"{result['name']} - {result['time']} - {result['player']} - {result['titles']} - {result['country']}")
# Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland
So sánh
| Tiêu chí | Split thủ công | Thư viện parse |
|---|---|---|
| Độ phức tạp code | Cao (nhiều split, strip) | Thấp (khai báo template) |
| Khả năng bảo trì | Khó khi format thay đổi | Dễ dàng sửa template |
| Hiệu năng | Nhanh cho chuỗi đơn giản | Chậm hơn một chút |
| Phụ thuộc | Không (built-in) | Cần cài parse |
Kết luận
Với log có cấu trúc cố định, thư viện parse là lựa chọn tốt nhất nhờ code ngắn gọn, dễ đọc, dễ bảo trì. Chỉ dùng split thủ công khi không muốn cài thêm package hoặc format quá đơn giản.