Xử lý dữ liệu bảng hiệu quả với module csv trong Python

Giới thiệu về module csv

Trong lập trình Python, csv là một thư viện chuẩn được thiết kế để hỗ trợ việc đọc và ghi tệp tin định dạng CSV (Comma-Separated Values). Đây là định dạng phổ biến nhất để lưu trữ dữ liệu bảng đơn giản, thường được xuất ra từ các phần mềm bảng tính như Excel hoặc các hệ quản trị cơ sở dữ liệu.

Module này xử lý tốt các trường hợp phức tạp mà việc sử dụng phương thức split(',') thông thường không giải quyết được, chẳng hạn như các trường dữ liệu chứa dấu phẩy bên trong dấu ngoặc kép hoặc các ký tự xuống dòng nội bộ.

Các chức năng chính để đọc dữ liệu

Sử dụng csv.reader

Hàm csv.reader trả về một đối tượng lặp, trong đó mỗi dòng dữ liệu được chuyển đổi thành một danh sách (list) các chuỗi.

import csv

# Đọc tệp tin theo cách cơ bản
with open('danh_sach_lop.csv', mode='r', encoding='utf-8', newline='') as f:
    data_reader = csv.reader(f, delimiter=',')
    for index, row in enumerate(data_reader):
        if index == 0:
            print(f"Tiêu đề cột: {', '.join(row)}")
        else:
            print(f"Dòng {index}: {row}")

Sử dụng csv.DictReader

Nếu tệp CSV có dòng tiêu đề, csv.DictReader là lựa chọn tối ưu hơn vì nó ánh xạ dữ liệu của mỗi dòng vào một từ điển (dictionary). Khóa của từ điển chính là tên các cột.

import csv

with open('kho_hang.csv', mode='r', encoding='utf-8', newline='') as f:
    dict_reader = csv.DictReader(f)
    for item in dict_reader:
        # Truy cập dữ liệu thông qua tên cột
        print(f"Sản phẩm: {item['Ten_SP']} - Giá: {item['Gia_Ban']}")

Các chức năng chính để ghi dữ liệu

Sử dụng csv.writer

Để lưu dữ liệu vào tệp, csv.writer cung cấp các phương thức như writerow() (ghi một dòng) và writerows() (ghi nhiều dòng cùng lúc).

import csv

header = ['ID', 'Toa_Do_X', 'Toa_Do_Y']
points = [
    (1, 10.5, 20.3),
    (2, 15.2, 18.7),
    (3, 12.0, 22.1)
]

with open('points.csv', mode='w', encoding='utf-8', newline='') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(header)
    csv_writer.writerows(points)

Sử dụng csv.DictWriter

Khi dữ liệu của bạn ở dạng danh sách các từ điển, csv.DictWriter giúp việc ghi file trở nên minh bạch và ít sai sót hơn.

import csv

field_names = ['Ma_NV', 'Ho_Ten', 'Chuc_Vu']
employees = [
    {'Ma_NV': 'NV01', 'Ho_Ten': 'Nguyen Van A', 'Chuc_Vu': 'Manager'},
    {'Ma_NV': 'NV02', 'Ho_Ten': 'Tran Thi B', 'Chuc_Vu': 'Developer'}
]

with open('nhan_vien.csv', mode='w', encoding='utf-8', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=field_names)
    writer.writeheader()  # Ghi dòng tiêu đề dựa trên fieldnames
    writer.writerows(employees)

Tùy chỉnh định dạng với Dialect

Đôi khi tệp tin không sử dụng dấu phẩy làm dấu phân cách mà sử dụng dấu chấm phẩy (;) hoặc tab (\t). Module csv cho phép tùy chỉnh thông qua tham số dialect hoặc các tham số định dạng trực tiếp:

  • delimiter: Ký tự phân cách các trường (mặc định là ',').
  • quotechar: Ký tự dùng để bao quanh các trường chứa ký tự đặc biệt (mặc định là '"').
  • quoting: Quy định khi nào thì dùng dấu ngoặc kép (ví dụ: csv.QUOTE_ALL, csv.QUOTE_MINIMAL).

Lưu ý quan trọng khi làm việc với file CSV

Để tránh các lỗi phổ biến, hãy tuân thủ các quy tắc sau:

Vấn đề Giải pháp
Dòng trống xen kẽ Luôn sử dụng tham số newline='' khi mở file bằng hàm open().
Lỗi hiển thị tiếng Việt Sử dụng encoding='utf-8' hoặc encoding='utf-8-sig' (nếu mở bằng Excel).
Dữ liệu lớn Đối với các tệp tin hàng GB, nên cân nhắc sử dụng thư viện pandas với hàm read_csv để tối ưu hiệu năng.

So sánh csv module và Pandas

Mặc dù module csv rất mạnh mẽ cho các tác vụ cơ bản, nhưng trong các dự án khoa học dữ liệu, Pandas thường được ưu tiên hơn nhờ khả năng xử lý vector hóa và các công cụ lọc dữ liệu tích hợp sẵn. Tuy nhiên, module csv vẫn là lựa chọn số một khi bạn muốn giữ cho ứng dụng nhẹ nhàng, không phụ thuộc vào thư viện bên ngoài.

Thẻ: python CSV data-manipulation file-io

Đăng vào ngày 4 tháng 8 lúc 10:58