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.csvBên trong:
name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Quang NamNếu có 4 dòng thì còn ngồi đọc được.
Nhưng nếu có:
10.000 dònghoặc:
100.000 dòngthì...
"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,HanoiBạn có thể nhìn nó và tưởng tượng thành một bảng:
| name | age | city |
|---|---|---|
| An | 25 | Da Nang |
| Binh | 30 | Hue |
| Chi | 28 | Hanoi |
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ộtCSV cũng có:
Hàng + cộtNhưng CSV không phải là file Excel.
Ví dụ Excel có thể lưu:
customers.xlsxCòn CSV:
customers.csvCSV thường chỉ chứa dữ liệu dạng text.
Ví dụ:
name,age,city
An,25,Da Nang
Binh,30,HueNó 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.csvNội dung:
name,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Quang NamLưu lại.
Cấu trúc:
customers.csvvà:
name,age,citylà 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:
csvBạ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 csvcó 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.csvlà 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í MinhNế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 NangPython đọ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ố:
25Hai thứ này khác nhau.
Ví dụ:
age = "25"là chuỗi.
Còn:
age = 25là 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ả:
3010. Đọ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
DungVì:
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ừ:
0chứ 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,HanoiDò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.DictReaderVí 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 NamNhì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.csvNội dung:
product,quantity,price
Keyboard,2,25
Mouse,5,10
Monitor,1,200Python:
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.0Bâ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.csvvới:
100 khách hàngBạ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òngthì 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 NangCode:
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
DungPython 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.csvNhưng bạn viết:
open("customers.csv")Python đang tìm:
my_project/customers.csvtrong khi file thực sự nằm ở:
my_project/data/customers.csvBạ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í MinhBạ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ẵngbiến thành:
Äà Nẵngrồ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ẵngCó vấn đề.
Python có thể hiểu:
An
123 Đường ABC
Đà Nẵngthà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 csvlà có thể đọc CSV.
Nhưng trong thực tế phân tích dữ liệu, bạn sẽ thường gặp:
pandasVí 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 / columnSau đó:
pandas
↓
Xử lý dữ liệu lớn và phức tạp hơn
↓
Filter
Sort
Group
Calculate
AnalyzeTứ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.csv2️⃣ 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.csvthì:
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,citythì có thể dùng:
csv.DictReader6️⃣ 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.csvname,age,city
An,25,Da Nang
Binh,30,Hue
Chi,28,Hanoi
Dung,35,Da NangPython:
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 NangKhô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,HueNhưng hãy tưởng tượng:
100.000 dòngPython có thể:
Đọc
↓
Lọc
↓
Tính toán
↓
Đổi dữ liệu
↓
Xuất file mớiVà 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.csvBạn mở lên.
Thấy:
10 dòngBạ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ầnCon 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 csvBiế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ý
FileNotFoundErrorBiế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() và 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,HueNhư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ạtVà đâ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. 😄