Thứ Sáu, 11 tháng 9, 2026

Đọc CSV bằng Python (Khi Python bắt đầu đọc được cả đống dữ liệu mà bạn không muốn ngồi nhập bằng tay.)

Tưởng tượng chủ quán Phở viết một dòng trên giấy: Tên món, Số lượng, Giá tiền rồi xuống dòng viết tiếp: Phở bò, 2, 50000. Nhìn vào bạn có thấy "Dễ thở" không?

Bạn đã đi qua:

  • Pip – cài package.
  • Virtual Environment – mỗi project một môi trường riêng.
  • requirements.txt – ghi lại project cần những package gì.

Đến đây, Python đã có:

🧰 Công cụ
🏠 Căn phòng riêng
📦 Đủ đồ nghề

Vậy tiếp theo làm gì?

Cho nó làm việc.

Và một trong những thứ đầu tiên rất thực tế là:

Đọc dữ liệu.

Ví dụ bạn có một file:

customers.csv

Bên trong:

name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Quang Nam

Nếu có 4 dòng thì còn ngồi đọc được.

Nhưng nếu có:

10.000 dòng

hoặc:

100.000 dòng

thì...

"Thôi Python đọc giùm tôi với." 😭

Đó chính là lúc CSV xuất hiện.


1. CSV là gì?

CSV là viết tắt của:

Comma-Separated Values

Có thể hiểu đơn giản:

Một file lưu dữ liệu dạng bảng, trong đó các giá trị thường được ngăn cách bằng dấu phẩy.

Ví dụ:

name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi

Bạn có thể nhìn nó và tưởng tượng thành một bảng:

nameagecity
An25Da Nang
Binh30Hue
Chi28Hanoi

CSV nhìn rất đơn giản.

Không màu mè.

Không có nút bấm.

Không có biểu đồ lung linh.

Chỉ có dữ liệu.

Nhưng chính vì đơn giản nên CSV xuất hiện ở rất nhiều nơi.


2. CSV giống Excel nhưng "mộc" hơn

Nếu bạn từng dùng Excel, có thể hình dung:

Excel
↓
Bảng dữ liệu
↓
Hàng + cột

CSV cũng có:

Hàng + cột

Nhưng CSV không phải là file Excel.

Ví dụ Excel có thể lưu:

customers.xlsx

Còn CSV:

customers.csv

CSV thường chỉ chứa dữ liệu dạng text.

Ví dụ:

name,age,city
An,25,Da Nang
Binh,30,Hue

Nó không quan tâm:

  • màu nền
  • font chữ
  • ô nào màu vàng
  • biểu đồ
  • nút bấm

Nó chỉ nói:

"Đây là dữ liệu."


3. Tự tạo một file CSV đầu tiên

Bạn có thể mở Notepad và tạo file:

customers.csv

Nội dung:

name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Quang Nam

Lưu lại.

Cấu trúc:

customers.csv

và:

name,age,city

là dòng tiêu đề.

Các dòng phía dưới là dữ liệu.


4. Python đọc CSV bằng cách nào?

Python có sẵn module:

csv

Bạn không nhất thiết phải cài thêm package.

Ví dụ:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row)

Chạy chương trình.

Bạn có thể nhận được:

['name', 'age', 'city']
['An', '25', 'Da Nang']
['Binh', '30', 'Hue']
['Chi', '28', 'Hanoi']
['Dung', '35', 'Quang Nam']

Python đã đọc từng dòng thành một list.


5. import csv là gì?

Dòng:

import csv

có nghĩa đơn giản:

"Python ơi, cho tôi dùng công cụ CSV."

Giống như bạn vào bếp:

"Lấy cho tôi cái dao."

Python:

"Có ngay." 😄

csv là module có sẵn trong Python để làm việc với dữ liệu CSV.


6. open() dùng để làm gì?

Đoạn này:

open("customers.csv", "r", encoding="utf-8")

dùng để mở file.

Trong đó:

customers.csv

là tên file.

"r"

là:

read – đọc

Còn:

encoding="utf-8"

giúp Python đọc text Unicode, đặc biệt quan trọng khi dữ liệu có tiếng Việt.

Ví dụ:

Nguyễn Văn An
Đà Nẵng
Hồ Chí Minh

Nếu encoding không phù hợp, bạn có thể gặp lỗi hoặc chữ bị biến dạng.


7. Tại sao dùng with open()?

Bạn có thể thấy:

with open("customers.csv", "r", encoding="utf-8") as file:

Cách viết này rất phổ biến trong Python.

Bạn có thể hiểu đơn giản:

"Mở file để làm việc, làm xong thì đóng lại cho tôi."

Không cần tự nhớ:

file.close()

Python sẽ xử lý việc đóng file sau khi khối with kết thúc.

Đây là một thói quen tốt khi làm việc với file.


8. csv.reader() làm gì?

Dòng:

reader = csv.reader(file)

nói với Python:

"Hãy đọc file này theo định dạng CSV."

Sau đó:

for row in reader:
    print(row)

Python sẽ đi qua từng dòng.

Ví dụ dòng:

An,25,Da Nang

được đọc thành:

['An', '25', 'Da Nang']

9. Vì sao 25 lại thành '25'?

Đây là một điểm rất quan trọng.

Trong CSV:

An,25,Da Nang

Python đọc dữ liệu CSV cơ bản dưới dạng chuỗi.

Vì vậy:

row[1]

có thể là:

'25'

chứ không phải số:

25

Hai thứ này khác nhau.

Ví dụ:

age = "25"

là chuỗi.

Còn:

age = 25

là số nguyên.

Nếu cần tính toán:

age = int(age)

Ví dụ:

age = "25"

age = int(age)

print(age + 5)

Kết quả:

30

10. Đọc CSV và lấy từng cột

Ví dụ:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)

    for row in reader:
        print(row[0])

Kết quả:

name
An
Binh
Chi
Dung

Vì:

row[0]

là cột đầu tiên.

Còn:

row[1]

là cột thứ hai.

row[2]

là cột thứ ba.

Python bắt đầu đếm từ:

0

chứ không phải:

1

Đây là "truyền thống lâu đời" của lập trình. 😆


11. Muốn bỏ dòng tiêu đề thì sao?

File:

name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi

Dòng đầu tiên là header.

Bạn có thể đọc riêng nó:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)

    header = next(reader)

    print("Header:", header)

    for row in reader:
        print(row)

Kết quả:

Header: ['name', 'age', 'city']

['An', '25', 'Da Nang']
['Binh', '30', 'Hue']
['Chi', '28', 'Hanoi']

next(reader) lấy dòng tiếp theo từ CSV.

Ở đây nó lấy dòng đầu tiên.


12. Cách đọc CSV dễ hiểu hơn: DictReader

Có một cách rất tiện:

csv.DictReader

Ví dụ:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row)

Bạn có thể nhận được dạng:

{'name': 'An', 'age': '25', 'city': 'Da Nang'}

Bây giờ thay vì:

row[0]

bạn có thể dùng:

row["name"]

Hoặc:

row["city"]

Cách này thường dễ đọc hơn rất nhiều.


13. Ví dụ thực tế với DictReader

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row["name"], "-", row["city"])

Kết quả:

An - Da Nang
Binh - Hue
Chi - Hanoi
Dung - Quang Nam

Nhìn code cũng dễ hiểu hơn:

row["name"]

thay vì:

row[0]

Bạn đọc code sau vài tháng vẫn còn hiểu.

Chứ:

row[7]

thì vài tháng sau chính bạn cũng phải hỏi:

"Số 7 là cái gì vậy?" 😭


14. Một ví dụ thực tế hơn

Giả sử bạn có:

sales.csv

Nội dung:

product,quantity,price
Keyboard,2,25
Mouse,5,10
Monitor,1,200

Python:

import csv

with open("sales.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        product = row["product"]
        quantity = int(row["quantity"])
        price = float(row["price"])

        total = quantity * price

        print(product, "=", total)

Kết quả:

Keyboard = 50.0
Mouse = 50.0
Monitor = 200.0

Bây giờ Python không chỉ đọc dữ liệu.

Nó đã bắt đầu:

đọc → chuyển kiểu → tính toán → đưa ra kết quả.

Đây chính là lúc CSV trở nên thú vị.


15. CSV rất hữu ích khi dữ liệu nhiều

Ví dụ bạn có:

customers.csv

với:

100 khách hàng

Bạn có thể dùng Python để:

  • đọc danh sách
  • tìm khách hàng
  • lọc theo thành phố
  • tính tuổi trung bình
  • đếm số lượng khách hàng
  • xuất dữ liệu mới
  • xử lý hàng loạt

Nếu có:

100.000 dòng

thì việc dùng Python càng có ý nghĩa.

Thay vì:

"Mở Excel..."

"Kéo xuống..."

"Filter..."

"Copy..."

"Paste..."

"Ủa sao mất dữ liệu?"

😭

Python có thể làm hàng loạt.


16. Ví dụ: chỉ lấy khách hàng ở Đà Nẵng

File:

name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Da Nang

Code:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        if row["city"] == "Da Nang":
            print(row["name"])

Kết quả:

An
Dung

Python vừa đọc CSV vừa lọc dữ liệu.


17. Một lỗi rất hay gặp: FileNotFoundError 😭

Bạn chạy:

with open("customers.csv", "r", encoding="utf-8") as file:

Nhưng Python báo:

FileNotFoundError

Đừng lập tức:

"CSV bị hỏng!" 😭

Thường có thể là Python không tìm thấy file ở vị trí nó đang tìm.

Ví dụ:

my_project/
│
├── main.py
└── data/
    └── customers.csv

Nhưng bạn viết:

open("customers.csv")

Python đang tìm:

my_project/customers.csv

trong khi file thực sự nằm ở:

my_project/data/customers.csv

Bạn cần:

open("data/customers.csv", "r", encoding="utf-8")

Đường dẫn file là một trong những thứ rất đáng kiểm tra đầu tiên khi gặp FileNotFoundError.


18. Một lỗi khác: CSV có tiếng Việt bị lỗi chữ

Ví dụ CSV chứa:

Nguyễn Văn An
Đà Nẵng
Hồ Chí Minh

Bạn mở bằng:

open("customers.csv", "r")

có thể gặp vấn đề tùy cách file được lưu.

Với dữ liệu tiếng Việt, thường nên chỉ rõ:

encoding="utf-8"

Ví dụ:

with open("customers.csv", "r", encoding="utf-8") as file:

Nếu file được tạo bằng một công cụ sử dụng encoding khác, bạn có thể cần xác định encoding thực tế của file.

Đừng thấy chữ:

Đà Nẵng

biến thành:

Đà Nẵng

rồi kết luận:

"Python ghét tiếng Việt." 😂

Python không ghét.

Hai bên chỉ đang không thống nhất cách mã hóa chữ.


19. Một lỗi nữa: Dấu phẩy trong dữ liệu

CSV thường dùng dấu phẩy để phân cách.

Nhưng giả sử:

name,address
An,123 Đường ABC, Đà Nẵng

Có vấn đề.

Python có thể hiểu:

An
123 Đường ABC
 Đà Nẵng

thành nhiều cột.

Trong CSV chuẩn, dữ liệu có chứa dấu phẩy thường cần được đặt trong dấu ngoặc kép:

name,address
An,"123 Đường ABC, Đà Nẵng"

Khi đó Python có thể hiểu cả địa chỉ là một trường.

Đây là một trong những lý do:

Đừng nghĩ CSV chỉ đơn giản là "cứ thấy dấu phẩy thì tách".

CSV có quy tắc của nó.

May mắn là module csv của Python giúp chúng ta xử lý phần lớn những trường hợp này.


20. Có cần pandas để đọc CSV không?

Không bắt buộc.

Python có sẵn:

import csv

là có thể đọc CSV.

Nhưng trong thực tế phân tích dữ liệu, bạn sẽ thường gặp:

pandas

Ví dụ:

import pandas as pd

df = pd.read_csv("customers.csv")

print(df)

Pandas rất mạnh trong việc:

  • xử lý bảng dữ liệu
  • lọc dữ liệu
  • tính toán
  • nhóm dữ liệu
  • xử lý file CSV
  • phân tích dữ liệu

Nhưng ở bài này, chúng ta học csv trước để hiểu bản chất.

Đừng mới học Python đã:

"Pandas đâu? Cho tôi pandas!" 😆

Biết Python đọc file bằng module csv trước sẽ giúp bạn hiểu chuyện gì đang xảy ra phía dưới.


21. CSV và Pandas sẽ gặp nhau ở đâu?

Bạn có thể hình dung:

csv module
↓
Hiểu cách CSV hoạt động
↓
Đọc từng dòng
↓
Hiểu row / column

Sau đó:

pandas
↓
Xử lý dữ liệu lớn và phức tạp hơn
↓
Filter
Sort
Group
Calculate
Analyze

Tức là hôm nay chúng ta học:

"Python đọc được CSV."

Sau này có thể tiến tới:

"Python xử lý cả bảng dữ liệu."

Và đó là một bước rất đáng giá.


22. Debug CSV theo kiểu DatVietLapTrinh 🕵️

Khi đọc CSV bị lỗi, đừng sửa lung tung.

Hãy hỏi từng câu:

1️⃣ File có thực sự tồn tại không?

Kiểm tra:

customers.csv

2️⃣ Python đang chạy từ thư mục nào?

Bạn có thể kiểm tra:

import os

print(os.getcwd())

Nó cho biết current working directory.

3️⃣ Đường dẫn có đúng không?

Nếu file nằm trong:

data/customers.csv

thì:

open("data/customers.csv")

4️⃣ Encoding có đúng không?

Thử:

encoding="utf-8"

5️⃣ CSV có header không?

Nếu có:

name,age,city

thì có thể dùng:

csv.DictReader

6️⃣ Dữ liệu có đúng kiểu không?

Nhớ rằng:

"25"

là chuỗi.

Nếu cần tính:

int("25")

23. Một chương trình hoàn chỉnh nhỏ

Bây giờ gom những thứ vừa học.

File:

customers.csv
name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Da Nang

Python:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        name = row["name"]
        age = int(row["age"])
        city = row["city"]

        print(f"{name} - {age} tuổi - {city}")

Kết quả:

An - 25 tuổi - Da Nang
Binh - 30 tuổi - Hue
Chi - 28 tuổi - Hanoi
Dung - 35 tuổi - Da Nang

Không cần:

  • mở Excel
  • copy từng dòng
  • đọc bằng mắt
  • nhập lại dữ liệu

Python làm thay bạn.


24. Đây chính là nền móng của Automation

Có một điều rất đáng chú ý.

CSV hôm nay có thể nhìn rất bình thường:

name,age,city
An,25,Da Nang
Binh,30,Hue

Nhưng hãy tưởng tượng:

100.000 dòng

Python có thể:

Đọc
 ↓
Lọc
 ↓
Tính toán
 ↓
Đổi dữ liệu
 ↓
Xuất file mới

Và sau này:

CSV
 ↓
Python
 ↓
Automation

Đó chính là hướng chúng ta đang đi.


25. Chua thêm 😆: Excel nhìn bạn, Python nhìn 100.000 dòng

Có một file:

customers.csv

Bạn mở lên.

Thấy:

10 dòng

Bạn:

"Dễ."

100 dòng:

"Cũng được."

1.000 dòng:

"Hơi mệt."

10.000 dòng:

"Excel ơi cố lên."

100.000 dòng:

"Thôi..."

😭

Python:

for row in reader:
    ...

Python:

"Còn bao nhiêu?"

Bạn:

"100.000."

Python:

"Rồi sao?"

😂

Đây chính là một trong những lý do chúng ta học lập trình.

Không phải để khoe:

"Tôi biết Python."

Mà là để những công việc lặp đi lặp lại và dễ phát điên được máy làm thay.


26. Chua thêm lần 2: Đừng làm nghề "copy → paste" bằng tay 😆

Có những công việc:

Mở file
↓
Copy
↓
Paste
↓
Kiểm tra
↓
Copy
↓
Paste
↓
Lặp lại 5.000 lần

Con người:

"Tôi cần nghỉ."

Python:

"Tôi cần thêm việc." 😂

Đó là tư duy Automation.

Và CSV là một trong những loại dữ liệu rất thích hợp để Python bắt đầu tập làm những việc đó.


27. Checklist – Đọc CSV bằng Python đã ổn chưa? ✅

CSV

  • Biết CSV là gì

  • Hiểu hàng và cột

  • Biết header là gì

  • Biết CSV thường dùng dấu phẩy để phân cách dữ liệu

  • Biết CSV không phải Excel

Python

  • Biết:

import csv
  • Biết:

open()
  • Hiểu:

encoding="utf-8"
  • Biết:

csv.reader()
  • Biết:

csv.DictReader()
  • Biết:

next(reader)

Dữ liệu

  • Hiểu dữ liệu CSV cơ bản được đọc dưới dạng chuỗi

  • Biết dùng:

int()
  • Biết dùng:

float()

Debug

  • Biết xử lý FileNotFoundError

  • Biết kiểm tra đường dẫn

  • Biết kiểm tra thư mục hiện tại

  • Biết để ý encoding

  • Biết CSV có thể gặp dấu phẩy bên trong dữ liệu


28. FAQ nhanh

❓ CSV có phải Excel không?

Không.

CSV là dữ liệu dạng text có cấu trúc hàng/cột.

Excel có nhiều tính năng hơn như:

  • định dạng
  • công thức
  • biểu đồ
  • nhiều sheet

CSV chủ yếu tập trung vào dữ liệu.


❓ Python có cần cài package để đọc CSV không?

Không.

Python có sẵn:

import csv

csv.reader()csv.DictReader() khác nhau thế nào?

csv.reader() trả về từng dòng dạng list:

['An', '25', 'Da Nang']

csv.DictReader() giúp truy cập theo tên cột:

row["name"]
row["city"]

Với người mới, DictReader thường dễ đọc hơn khi dữ liệu có nhiều cột.


❓ Tại sao tuổi trong CSV lại là chuỗi?

CSV chủ yếu lưu dữ liệu dưới dạng text.

Vì vậy:

25

được đọc thành:

"25"

Nếu cần tính toán:

int("25")

❓ CSV có thể chứa tiếng Việt không?

Có.

Nhưng bạn nên chú ý encoding.

Ví dụ:

encoding="utf-8"

❓ Có nên dùng pandas không?

Có thể.

Pandas rất mạnh cho dữ liệu bảng.

Nhưng học csv trước giúp bạn hiểu cách Python xử lý CSV ở mức cơ bản.


29. Tóm lại

CSV nhìn rất đơn giản:

name,age,city
An,25,Da Nang
Binh,30,Hue

Nhưng nó là một trong những dạng dữ liệu rất hữu ích để Python bắt đầu làm việc với thế giới thực.

Bạn chỉ cần nhớ:

import csv

with open("customers.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)

    for row in reader:
        print(row["name"])

Python có thể:

Đọc file
   ↓
Đọc từng dòng
   ↓
Lấy từng cột
   ↓
Lọc dữ liệu
   ↓
Tính toán
   ↓
Xử lý hàng loạt

Và đây mới là điều đáng nói.

Lập trình bắt đầu trở nên thú vị khi máy tính không chỉ tính 2 + 2, mà bắt đầu làm những việc bạn thực sự không muốn làm bằng tay. 😄