🐍 Ngày 35 - Python hằng ngày 365 ngày - Tạo và ghi file
🎯 Mục tiêu
Học cách tạo, ghi và đọc file văn bản (.txt) trong Python.
🧠 Kiến thức chính
- Dùng
open("filename", "mode")để mở file:"w": ghi mới (xoá nội dung cũ nếu có)"a": ghi tiếp vào cuối file"r": chỉ đọc
- Nên dùng
with open(...)để đảm bảo đóng file tự động.
📦 Ví dụ: Ghi và đọc file
# Ghi nội dung vào file
with open("demo.txt", "w", encoding="utf-8") as f:
f.write("Xin chào Python!\n")
f.write("Hôm nay là ngày 35\n")
# Đọc lại nội dung file
with open("demo.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
📂 Sau khi chạy, bạn sẽ thấy file demo.txt trong thư mục hiện tại.
📝 Bài tập thực hành
Bài 1: Tạo file note.txt và ghi 3 dòng bất kỳ
Bài 2: Ghi danh sách vào file
lines = ["Dòng 1", "Dòng 2", "Dòng 3"]
- Ghi từng dòng vào file
lines.txt(mỗi phần tử 1 dòng) - Đọc lại nội dung và in ra màn hình.
💡 Gợi ý
- Dùng vòng lặp
forđể ghi nhiều dòng. - Dùng
f.write(line + "\n")để đảm bảo mỗi dòng cách dòng.
📌 Ghi chú
- File sẽ nằm cùng thư mục với file Python nếu không chỉ định đường dẫn cụ thể.
- Dùng
os.path.exists()để kiểm tra file có tồn tại không trước khi đọc.
🔍 Ba chế độ mở file — và cái bẫy khiến dữ liệu biến mất
Ba chế độ cơ bản nhưng khác biệt rất lớn:
| Chế độ | Ý nghĩa | Nếu file đã tồn tại | Nếu file chưa có |
|---|---|---|---|
"r" | Chỉ đọc | Đọc bình thường | ❌ FileNotFoundError |
"w" | Ghi | XOÁ SẠCH nội dung cũ | Tạo mới |
"a" | Ghi tiếp | Thêm vào cuối | Tạo mới |
"x" | Tạo mới | ❌ FileExistsError | Tạo mới |
"r+" | Đọc + ghi | Ghi đè từ đầu | ❌ Lỗi |
⚠️ Cái bẫy chết người nhất của người mới: mở file bằng
"w"khi định đọc nó. Dòngopen("du-lieu.txt", "w")sẽ xoá sạch file ngay lập tức — trước cả khi bạn viết gì. Nếu file đó chứa dữ liệu quan trọng, nó đã mất. Luôn kiểm tra chế độ trước khi chạy.
Đọc file theo ba cách khác nhau
# CÁCH 1: read() — đọc toàn bộ (chỉ dùng với file nhỏ)
with open("demo.txt", "r", encoding="utf-8") as f:
noi_dung = f.read()
# CÁCH 2: đọc từng dòng bằng vòng lặp — tiết kiệm bộ nhớ
with open("du-lieu-lon.txt", "r", encoding="utf-8") as f:
for dong in f:
xu_ly(dong.rstrip())
# CÁCH 3: readlines() — trả về list các dòng
with open("demo.txt", "r", encoding="utf-8") as f:
danh_sach_dong = f.readlines()
| Cách | Bộ nhớ dùng | Dùng khi |
|---|---|---|
read() | Toàn bộ file vào RAM | File < 10 MB |
Vòng lặp for | Một dòng | File lớn bất kỳ |
readlines() | Toàn bộ file | Cần truy cập theo chỉ số |
Đọc file 5 GB bằng read() sẽ làm chương trình hết RAM và chết. Vòng lặp for xử lý được file lớn đến mức ổ đĩa còn chỗ.
encoding="utf-8" — đừng bao giờ bỏ qua
# ❌ SAI trên Windows: dùng bảng mã mặc định (cp1252)
with open("tieng-viet.txt", "w") as f:
f.write("Xin chào Việt Nam")
# → File lưu sai, hoặc lỗi UnicodeEncodeError
# ✅ ĐÚNG: luôn chỉ định encoding
with open("tieng-viet.txt", "w", encoding="utf-8") as f:
f.write("Xin chào Việt Nam")
Trên Windows, bảng mã mặc định là cp1252 (không hỗ trợ tiếng Việt đầy đủ). Luôn viết encoding="utf-8" — thói quen nhỏ này tránh rất nhiều lỗi khó hiểu.
📊 Ghi các định dạng dữ liệu khác
Ghi CSV — có cấu trúc, mở được bằng Excel
import csv
# Ghi CSV có header — cách đúng
with open("diem.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["ten", "toan", "ly", "hoa"])
writer.writerow(["Minh", 9, 8, 7.5])
writer.writerow(["Lan", 8.5, 9, 9.5])
💡 Hai chi tiết quan trọng trong đoạn code trên:
newline=""— nếu bỏ, trên Windows mỗi dòng sẽ có hai ký tự xuống dòng (\r\n\r\n), làm file CSV bị lỗi khi mở bằng Excel.encoding="utf-8-sig"— thêm BOM để Excel mở tiếng Việt không bị lỗi font.
Ghi JSON — định dạng trao đổi dữ liệu phổ biến nhất
import json
hoc_sinh = {
"ten": "Minh",
"tuoi": 16,
"diem": {"toan": 9, "ly": 8},
"so_thich": ["đọc sách", "lập trình"],
}
# ensure_ascii=False → giữ tiếng Việt, không thành \u1ed3
with open("hoc-sinh.json", "w", encoding="utf-8") as f:
json.dump(hoc_sinh, f, ensure_ascii=False, indent=2)
# Đọc lại
with open("hoc-sinh.json", "r", encoding="utf-8") as f:
du_lieu = json.load(f)
print(du_lieu["diem"]["toan"])
Nếu bỏ ensure_ascii=False, tiếng Việt sẽ lưu thành Xin ch\u00e0o — vẫn đúng về dữ liệu nhưng không đọc được bằng mắt.
🛡️ Xử lý lỗi khi làm việc với file
from pathlib import Path
import json
def doc_cau_hinh(duong_dan: str) -> dict:
"""Đọc file cấu hình, xử lý mọi trường hợp lỗi."""
file = Path(duong_dan)
if not file.exists():
print(f"⚠️ Không tìm thấy {duong_dan}, dùng cấu hình mặc định")
return {"debug": False, "so_lan_thu": 3}
try:
with open(file, "r", encoding="utf-8") as f:
return json.load(f)
except json.JSONDecodeError as e:
print(f"❌ File {duong_dan} không phải JSON hợp lệ: {e}")
raise
except PermissionError:
print(f"❌ Không có quyền đọc {duong_dan}")
raise
except UnicodeDecodeError:
print(f"❌ File {duong_dan} không phải UTF-8. Thử encoding khác?")
raise
cau_hinh = doc_cau_hinh("cau-hinh.json")
print(cau_hinh)
Bảng lỗi thường gặp khi làm việc với file:
| Lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
FileNotFoundError | File không tồn tại | Kiểm tra Path.exists() trước |
PermissionError | File đang mở ở chương trình khác | Đóng Excel/Word trước |
UnicodeDecodeError | Sai encoding | Thử utf-8-sig, cp1252, latin-1 |
IsADirectoryError | Đường dẫn là thư mục | Kiểm tra Path.is_file() |
📝 Bài tập mở rộng
Bài 3: Ghi log có timestamp
Viết hàm ghi_log(thong_diep) ghi vào app.log theo định dạng:
2026-10-02 14:30:15 | INFO | Chương trình bắt đầu
Dùng chế độ "a" để không xoá log cũ.
Bài 4: Đếm từ trong file
Đọc file van-ban.txt (tự tạo), đếm:
- Tổng số dòng
- Tổng số từ
- Số lần xuất hiện của từ "Python"
Bài 5: Sao chép an toàn
Viết hàm sao_chep_an_toan(nguon, dich) — không ghi đè nếu file đích đã tồn tại. Nếu đã tồn tại, thêm số thứ tự: file(1).txt, file(2).txt.
Bài 6: Chuyển CSV sang JSON
Đọc diem.csv, chuyển thành diem.json dạng list các dict.
🎯 Tóm tắt ngày 35
✅ Phân biệt và dùng đúng 5 chế độ mở file
✅ Ba cách đọc file — chọn theo kích thước
✅ Luôn ghi encoding="utf-8"
✅ Ghi/đọc CSV và JSON đúng chuẩn
✅ Xử lý lỗi file thay vì để chương trình crash
🚀 Bắt đầu với Python
Bạn có thể mở bài học này trên Google Colab để chạy trực tiếp:
📺 Ngày 35 – Tạo và ghi file trong Python
Trong video này, bạn sẽ học cách tạo và ghi file trong Python bằng các chế độ "w" và "a". Một kỹ năng cực kỳ quan trọng để lưu trữ dữ liệu hoặc log!