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 Đọc tệp CSV với
Ghi tệp CSV với
Làm việc với dữ liệu dạng từ điển:
Khi tệp có hàng tiêu đề,
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 quotechar và skipinitialspace 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,trueLư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)