Bỏ qua để đến nội dung

Làm việc với CSV

CSV (Comma-Separated Values) là định dạng file văn bản dùng để lưu trữ dữ liệu dạng bảng. Mỗi dòng trong file là một hàng dữ liệu, các giá trị được ngăn cách bởi dấu phẩy.

  • ✅ Định dạng phổ biến để trao đổi dữ liệu
  • ✅ Dễ đọc bằng mắt thường
  • ✅ Mở được bằng Excel, Google Sheets
  • ✅ Thư viện csv của Python rất dễ sử dụng
name,age,city
Alice,25,New York
Bob,30,Los Angeles
Charlie,22,Chicago

Python có module csv built-in để làm việc với file CSV.

import csv
import csv
# Mở và đọc file CSV
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# Đọc từng dòng
for row in csv_reader:
print(row)

Output:

['name', 'age', 'city']
['Alice', '25', 'New York']
['Bob', '30', 'Los Angeles']
['Charlie', '22', 'Chicago']
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# Bỏ qua dòng đầu tiên
next(csv_reader)
for row in csv_reader:
name, age, city = row
print(f"{name} is {age} years old and lives in {city}")

Output:

Alice is 25 years old and lives in New York
Bob is 30 years old and lives in Los Angeles
Charlie is 22 years old and lives in Chicago
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
data = list(csv_reader)
print(data)
# [['name', 'age', 'city'], ['Alice', '25', 'New York'], ...]

DictReader đọc mỗi dòng thành dictionary với key là tên cột.

import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row)
print(f"Name: {row['name']}, Age: {row['age']}")

Output:

{'name': 'Alice', 'age': '25', 'city': 'New York'}
Name: Alice, Age: 25
{'name': 'Bob', 'age': '30', 'city': 'Los Angeles'}
Name: Bob, Age: 30
...
  • ✅ Truy cập dữ liệu bằng tên cột
  • ✅ Code dễ đọc và bảo trì
  • ✅ Tự động xử lý header
import csv
# Dữ liệu cần ghi
data = [
['name', 'age', 'city'],
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
['Charlie', 22, 'Chicago']
]
# Ghi vào file
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
# Ghi từng dòng
for row in data:
csv_writer.writerow(row)
import csv
data = [
['name', 'age', 'city'],
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles']
]
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(data) # writerows với s
import csv
data = [
['name', 'age', 'city'],
['Alice', 25, 'New York']
]
# Dùng tab thay vì comma
with open('output.tsv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file, delimiter='\t')
csv_writer.writerows(data)
import csv
# Dữ liệu dạng dictionary
data = [
{'name': 'Alice', 'age': 25, 'city': 'New York'},
{'name': 'Bob', 'age': 30, 'city': 'Los Angeles'},
{'name': 'Charlie', 'age': 22, 'city': 'Chicago'}
]
# Ghi vào file
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
fieldnames = ['name', 'age', 'city']
csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
# Ghi header
csv_writer.writeheader()
# Ghi dữ liệu
for row in data:
csv_writer.writerow(row)
import csv
# Dữ liệu mới
new_data = [
['David', 28, 'Boston'],
['Emily', 26, 'Seattle']
]
# Thêm vào cuối file
with open('data.csv', 'a', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(new_data)
import csv
# File CSV dùng dấu chấm phẩy
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file, delimiter=';')
for row in csv_reader:
print(row)
import csv
data = [
['name', 'quote'],
['Alice', 'She said "Hello"'],
['Bob', 'He likes "Python"']
]
with open('quotes.csv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL)
csv_writer.writerows(data)

Ví dụ 1: Đọc và xử lý dữ liệu điểm số

Phần tiêu đề “Ví dụ 1: Đọc và xử lý dữ liệu điểm số”
import csv
# Đọc file điểm học sinh
with open('scores.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for student in csv_reader:
name = student['name']
math = int(student['math'])
english = int(student['english'])
average = (math + english) / 2
print(f"{name}: Trung bình = {average:.1f}")
import csv
# Đọc dữ liệu và lọc
with open('employees.csv', 'r', encoding='utf-8') as infile:
csv_reader = csv.DictReader(infile)
# Lọc nhân viên có tuổi > 30
filtered_data = [row for row in csv_reader if int(row['age']) > 30]
# Ghi dữ liệu đã lọc
with open('senior_employees.csv', 'w', newline='', encoding='utf-8') as outfile:
fieldnames = ['name', 'age', 'department']
csv_writer = csv.DictWriter(outfile, fieldnames=fieldnames)
csv_writer.writeheader()
csv_writer.writerows(filtered_data)
import csv
from collections import Counter
# Đếm số người theo thành phố
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
cities = [row['city'] for row in csv_reader]
city_counts = Counter(cities)
print("Thống kê theo thành phố:")
for city, count in city_counts.items():
print(f"{city}: {count} người")
# ❌ SAI - Có thể tạo dòng trống
with open('data.csv', 'w') as file:
csv_writer = csv.writer(file)
# ✅ ĐÚNG
with open('data.csv', 'w', newline='') as file:
csv_writer = csv.writer(file)
# ❌ SAI - Lỗi với ký tự tiếng Việt
with open('data.csv', 'r') as file:
csv_reader = csv.reader(file)
# ✅ ĐÚNG
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# ❌ SAI
file = open('data.csv', 'r')
csv_reader = csv.reader(file)
# Quên file.close()
# ✅ ĐÚNG - Dùng with
with open('data.csv', 'r') as file:
csv_reader = csv.reader(file)
# Tự động đóng file
# ✅ TỐT
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# Code của bạn
# Với ký tự tiếng Việt
with open('data.csv', 'r', encoding='utf-8') as file:
# Code của bạn

3. Dùng DictReader/DictWriter cho code dễ đọc

Phần tiêu đề “3. Dùng DictReader/DictWriter cho code dễ đọc”
# ✅ TỐT - Dễ hiểu
with open('data.csv', 'r') as file:
reader = csv.DictReader(file)
for row in reader:
print(row['name']) # Rõ ràng
try:
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
process(row)
except FileNotFoundError:
print("File không tồn tại!")
except csv.Error as e:
print(f"Lỗi CSV: {e}")
Feature csv.reader csv.DictReader
Kiểu dữ liệu trả về List Dictionary
Truy cập dữ liệu Theo index: row[0] Theo key: row[‘name’]
Xử lý header Thủ công Tự động
Tốc độ Nhanh hơn một chút Chậm hơn một chút
Dễ đọc Ít hơn Nhiều hơn

Khuyến nghị: Dùng DictReader/DictWriter cho hầu hết trường hợp vì code dễ đọc và bảo trì.


Sau khi học xong bài này, hãy thực hành với các bài tập sau: