Bài 10: Đọc và ghi file trong Python

Bài 9 bạn đã biết xử lý lỗi để chương trình không sập. Nhưng đến giờ, mọi dữ liệu chương trình tạo ra đều biến mất khi tắt — vì nó chỉ nằm trong bộ nhớ tạm. Bài này dạy cách lưu dữ liệu ra file và đọc lại, để chương trình của bạn có thể “nhớ” giữa các lần chạy: ghi chú, danh sách, kết quả tính toán… Đây là bước biến chương trình từ “chạy rồi quên” thành “có ích thật sự”.
⏱️ Cách học bài này (~30 phút): đọc phần ghi/đọc file (10’), tự gõ và chạy các bài thực hành (12’), xem lỗi thường gặp (4’), tự kiểm + lưu code mang về (4’).
Mục tiêu bài học
Sau bài này bạn sẽ:
- Dùng
with openđể mở file an toàn. - Ghi dữ liệu ra file (
w) và ghi thêm (a). - Đọc file: toàn bộ hoặc từng dòng.
- Dùng
encoding="utf-8"cho tiếng Việt và xử lý file không tồn tại.
Nội dung: đọc và ghi file
1. Ghi ra file (chế độ “w”)
with open("ghichu.txt", "w", encoding="utf-8") as f:
f.write("Dòng 1\n") # \n = xuống dòng
f.write("Dòng 2\n")
with open(...) as f: mở file và tự đóng khi xong. Chế độ "w" tạo file mới (hoặc xóa sạch nội dung cũ nếu file đã có). Nhớ thêm \n để xuống dòng.
2. Đọc file (chế độ “r”)
# Đọc toàn bộ thành một chuỗi
with open("ghichu.txt", "r", encoding="utf-8") as f:
noi_dung = f.read()
print(noi_dung)
# Đọc từng dòng (hợp với file dài)
with open("ghichu.txt", "r", encoding="utf-8") as f:
for dong in f:
print(dong.strip()) # strip() bỏ ký tự xuống dòng thừa
3. Ghi thêm vào cuối (chế độ “a”)
with open("ghichu.txt", "a", encoding="utf-8") as f:
f.write("Dòng 3\n") # giữ nội dung cũ, thêm vào cuối
⚠️ Cẩn thận:
"w"ghi đè, xóa hết nội dung cũ;"a"ghi thêm, giữ nội dung cũ. Dùng nhầm"w"khi định thêm dữ liệu là mất sạch file — lỗi rất hay gặp.
4. Xử lý file không tồn tại
Mở file chế độ "r" mà file chưa có sẽ gây FileNotFoundError. Kết hợp try/except (Bài 9):
try:
with open("khong_co.txt", "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("File không tồn tại.")
💡 Sau khi bắt lỗi, tùy nhu cầu bạn nên làm gì đó tiếp — ví dụ tạo file mới, dùng nội dung mặc định, hoặc trả về chuỗi rỗng — thay vì chỉ in thông báo rồi thôi (xem hàm
doc_fileở phần Mang về).
Code mẫu có chú thích: sổ ghi chú đơn giản
Chương trình ghi một dòng ghi chú vào file rồi in lại toàn bộ. Ở đây dùng thêm enumerate(...) — hàm vừa lặp qua từng dòng vừa đánh số thứ tự (bắt đầu từ 1):
# Ghi thêm một dòng ghi chú mới
ghi_chu = input("Nhập ghi chú: ")
with open("so_ghi_chu.txt", "a", encoding="utf-8") as f:
f.write(ghi_chu + "\n") # thêm vào cuối, không mất cái cũ
# Đọc và in lại tất cả ghi chú
print("\n--- Tất cả ghi chú ---")
with open("so_ghi_chu.txt", "r", encoding="utf-8") as f:
for i, dong in enumerate(f, start=1):
print(f"{i}. {dong.strip()}")
Mấu chốt: dùng "a" để mỗi lần chạy thêm ghi chú mà không xóa cái cũ; enumerate đánh số dòng khi in.
Bài thực hành code (tự gõ)
Bài 1 — Ghi file: ghi 3 dòng tên món ăn yêu thích vào file mon_an.txt (chế độ "w"), mỗi món một dòng.
Bài 2 — Đọc file: mở mon_an.txt (chế độ "r") và in từng dòng, có đánh số 1, 2, 3.
Bài 3 — Ghi thêm: dùng chế độ "a" thêm một món nữa vào mon_an.txt, rồi đọc lại để kiểm tra món cũ vẫn còn.
Lỗi thường gặp & cách sửa
- Dùng
"w"khi định ghi thêm → mất sạch nội dung cũ. Ghi thêm phải dùng"a". FileNotFoundErrorkhi đọc → file chưa tồn tại hoặc sai tên/đường dẫn. Kiểm tra tên file, hoặc bọc try/except.- Tiếng Việt bị lỗi font → thiếu
encoding="utf-8". Luôn thêm khi mở file có tiếng Việt. - Quên
\n→ mọi thứ dính thành một dòng dài. Thêm\ncuối mỗi lầnwrite. - Quên đóng file → dùng
with openlà hết lo, nó tự đóng.
💾 Mang về — hàm đọc/ghi file an toàn
Lưu vào kho code cá nhân — dùng lại ở mọi chương trình cần lưu dữ liệu:
# file_io.py — đọc/ghi file an toàn
def ghi_file(ten_file, noi_dung):
with open(ten_file, "w", encoding="utf-8") as f:
f.write(noi_dung)
def them_dong(ten_file, dong):
with open(ten_file, "a", encoding="utf-8") as f:
f.write(dong + "\n")
def doc_file(ten_file):
try:
with open(ten_file, "r", encoding="utf-8") as f:
return f.read()
except FileNotFoundError:
return "(File không tồn tại)"
them_dong("nhat_ky.txt", "Hôm nay học đọc/ghi file.")
print(doc_file("nhat_ky.txt"))
Thuật ngữ chốt
| Thuật ngữ | Giải thích ngắn |
|---|---|
with open |
Mở file và tự động đóng khi xong |
chế độ "r" |
Đọc (read) — file phải tồn tại |
chế độ "w" |
Ghi mới (write) — xóa nội dung cũ |
chế độ "a" |
Ghi thêm (append) — giữ nội dung cũ |
encoding="utf-8" |
Bảng mã cho tiếng Việt hiển thị đúng |
.read() / .write() |
Đọc toàn bộ / ghi chuỗi vào file |
.strip() |
Bỏ khoảng trắng và ký tự xuống dòng thừa |
enumerate |
Vừa lặp vừa đánh số thứ tự (dùng enumerate(f, start=1)) |
Tự kiểm tra & lời giải
- Chế độ nào xóa sạch nội dung cũ khi ghi? (Đáp án:
"w") - Đọc file chưa tồn tại gây lỗi gì? (Đáp án:
FileNotFoundError) - Vì sao cần
encoding="utf-8"? (Đáp án: để tiếng Việt không bị lỗi font)
Lời giải Bài thực hành:
# Bài 1
with open("mon_an.txt", "w", encoding="utf-8") as f:
f.write("Phở\n")
f.write("Bún chả\n")
f.write("Cơm tấm\n")
# Bài 2
with open("mon_an.txt", "r", encoding="utf-8") as f:
for i, dong in enumerate(f, start=1):
print(f"{i}. {dong.strip()}")
# Bài 3
with open("mon_an.txt", "a", encoding="utf-8") as f:
f.write("Bánh mì\n")
with open("mon_an.txt", "r", encoding="utf-8") as f:
print(f.read())
Ghi nhớ nhanh
- Luôn dùng
with open(..., encoding="utf-8") as f:— tự đóng file, đúng tiếng Việt. "w"ghi đè,"a"ghi thêm,"r"đọc — nhớ kỹ để khỏi mất dữ liệu.- Đọc file có thể lỗi
FileNotFoundError→ bọc try/except khi cần an toàn.
👉 Bài tập về nhà: viết chương trình “danh sách việc cần làm”: mỗi lần chạy cho người dùng nhập một việc và lưu thêm vào file todo.txt (chế độ "a"), rồi in ra toàn bộ danh sách. Bài tiếp theo trong series: Bài 11 — Module và thư viện chuẩn (sắp đăng).
Câu hỏi thường gặp
Vì sao nên dùng 'with open' thay vì open() thường?
Vì ‘with open(…) as f:’ tự động đóng file khi khối lệnh kết thúc, kể cả khi có lỗi xảy ra. Nếu dùng open() thường, bạn phải nhớ gọi f.close() — quên đóng file có thể gây mất dữ liệu hoặc khóa file. Với người mới, hãy luôn dùng ‘with open’ làm mặc định; đây là cách chuẩn và an toàn nhất.
Các chế độ 'r', 'w', 'a' khi mở file khác nhau thế nào?
‘r’ (read) để đọc, file phải tồn tại sẵn. ‘w’ (write) để ghi mới — nó XÓA sạch nội dung cũ rồi ghi đè, và tạo file nếu chưa có. ‘a’ (append) để ghi THÊM vào cuối file mà giữ nguyên nội dung cũ. Nhớ kỹ: dùng nhầm ‘w’ khi định ‘a’ sẽ làm mất toàn bộ dữ liệu cũ trong file.
Vì sao phải thêm encoding='utf-8' khi làm việc với tiếng Việt?
Vì encoding quyết định cách Python hiểu các ký tự. Nếu không chỉ định, một số hệ điều hành (đặc biệt Windows) dùng bảng mã mặc định khác, khiến tiếng Việt bị lỗi font hoặc báo lỗi khi đọc/ghi. Luôn thêm encoding=‘utf-8’ khi mở file có tiếng Việt để chữ hiển thị đúng trên mọi máy.
Thợ code chính hiệu, thích dắt người mới qua mấy đoạn 'khó nhằn' bằng giọng nhẹ tênh. Châm ngôn: cứ làm dự án thật, sai thì sửa, vui là chính.
Bài liên quan

Bài 8: JavaScript — biến, hàm và sự kiện
Bài 8 series Web cơ bản (bài học 30 phút): thêm tương tác cho trang bằng JavaScript — biến, hàm và sự kiện click — làm một nút bấm đổi nội dung trang; kèm thực hành và file mang về.

Bài 9: Xử lý lỗi với try/except trong Python
Bài 9 series Python cho người mới (bài học 30 phút): dùng try/except để chương trình không sập khi gặp lỗi — bắt lỗi nhập liệu, báo lỗi thân thiện — qua chương trình nhập số an toàn; kèm bài tập và code mang về.

Bài 7: CSS — responsive cho điện thoại
Bài 7 series Web cơ bản (bài học 30 phút): làm trang co giãn đẹp trên điện thoại với thẻ viewport, đơn vị linh hoạt và media query — biến trang cá nhân thành responsive; kèm thực hành và file mang về.