Xử lý tệp CSV trong Python 3 với csv module

CSV (Comma-Separated Values) là định dạng văn bản thuần tuý, trong đó các trường dữ liệu được phân cách bởi dấu phẩy và mỗi bản ghi chiếm một dòng riêng. Toàn bộ giá trị — dù là số, ngày tháng hay ký tự đặc biệt — đều được lưu dưới dạng chuỗi. Khi làm việc với dữ liệu tiếng Việt hoặc ký tự Unicode, cần chú ý đến mã hoá phù hợp để tránh lỗi hiển thị, đặc biệt khi mở bằng Excel. Python 3 cung cấp thư viện chuẩn csv, cho phép đọc/ghi tệp CSV một cách linh hoạt và an toàn — bao gồm xử lý trích dẫn, thoát ký tự đặc biệt (như dấu phẩy trong chuỗi), và tự động phân tích cú pháp mà không cần viết parser thủ công.

Đọc tệp CSV với csv.reader

csv.reader trả về một đối tượng trình lặp (iterator), mỗi lần gọi next() hoặc duyệt vòng lặp sẽ trả về một dòng dưới dạng danh sách chuỗi. Tham số delimiter cho phép thay đổi ký tự phân cách (mặc định là dấu phẩy), còn quotecharskipinitialspace hỗ trợ cấu hình nâng cao. Ví dụ tệp đầu vào users.csv:
username,token,active
user_a,abc123,true
nguyễn_văn_a,xyz#789,true
"lee, jr",qwe456,false
"  admin  ",111,true
Lưu ý: Hai dòng cuối chứa dấu phẩy và khoảng trắng thừa — điều mà csv.reader xử lý chính xác nhờ cơ chế trích dẫn và loại bỏ khoảng trắng. Đoạn mã đọc:
import csv

with open('users.csv', encoding='utf-8-sig') as file_in:
    parser = csv.reader(file_in, skipinitialspace=True)
    titles = next(parser)  # Lấy tiêu đề
    print("Tiêu đề:", titles)
    
    for record in parser:
        # Chuyển đổi kiểu nếu cần: record[2] → bool(record[2].lower() == 'true')
        user_id, auth_key, is_enabled = record
        print(f"Người dùng: {user_id.strip()}, Token: {auth_key}, Trạng thái: {is_enabled}")

Ghi tệp CSV với csv.writer

csv.writer hỗ trợ hai phương thức chính: - writerow(iterable): ghi một hàng (ví dụ: danh sách hoặc tuple); - writerows(iterable_of_iterables): ghi nhiều hàng cùng lúc. Quan trọng: luôn mở tệp ở chế độ text ('w'), kèm tham số newline='' để ngăn Python chèn dòng trống dư do khác biệt giữa hệ điều hành. Để đảm bảo tương thích với Excel trên Windows, nên dùng encoding='utf-8-sig' thay vì utf-8 thuần. Ví dụ ghi:
fields = ['username', 'token', 'active', 'created_at']
rows = [
    ('alice', 't0k3n_001', 'true', '2024-04-01'),
    ('bình_lê', 't0k3n_002', 'false', '2024-04-02'),
    ('"dev@test"', 't0k3n_003', 'true', '2024-04-03'),
]

with open('exported.csv', 'w', encoding='utf-8-sig', newline='') as file_out:
    emitter = csv.writer(file_out, quoting=csv.QUOTE_MINIMAL)
    emitter.writerow(fields)
    emitter.writerows(rows)

Làm việc với dữ liệu dạng từ điển: DictReader & DictWriter

Khi tệp có hàng tiêu đề, csv.DictReader tự động ánh xạ mỗi cột vào một khoá từ điển — giúp truy cập theo tên thay vì chỉ số, tăng tính rõ ràng và dễ bảo trì. Tương tự, csv.DictWriter yêu cầu truyền danh sách tiêu đề khi khởi tạo, sau đó dùng writeheader() để ghi hàng đầu tiên, rồi writerow(dict) hoặc writerows(list_of_dicts) để ghi dữ liệu. Ví dụ:
with open('users.csv', encoding='utf-8-sig') as src:
    reader = csv.DictReader(src)
    for entry in reader:
        # entry là dict: {'username': '...', 'token': '...', ...}
        if entry['active'].lower() == 'true':
            print(f"✅ Kích hoạt: {entry['username']}")

# Ghi lại dưới dạng từ điển
output_data = [
    {'username': 'admin', 'token': 'root_2024', 'active': 'true', 'created_at': '2024-04-05'},
    {'username': 'tester', 'token': 'test_999', 'active': 'false', 'created_at': '2024-04-05'},
]

with open('audit_log.csv', 'w', encoding='utf-8-sig', newline='') as dst:
    writer = csv.DictWriter(dst, fieldnames=['username', 'token', 'active', 'created_at'])
    writer.writeheader()
    writer.writerows(output_data)

Thẻ: python3 CSV utf-8-sig DictReader DictWriter

Đăng vào ngày 21 tháng 6 lúc 21:39