Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Hướng dẫn trích xuất dữ liệu từ chuỗi có cấu trúc trong Python

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ôngThư viện parse
Độ phức tạp codeCao (nhiều split, strip)Thấp (khai báo template)
Khả năng bảo trìKhó khi format thay đổiDễ dàng sửa template
Hiệu năngNhanh cho chuỗi đơn giảnChậm hơn một chút
Phụ thuộcKhô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.