Chuyển tới nội dung chính

🐍 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ĩaNếu file đã tồn tạiNếu file chưa có
"r"Chỉ đọcĐọc bình thường❌ FileNotFoundError
"w"GhiXOÁ SẠCH nội dung cũTạo mới
"a"Ghi tiếpThêm vào cuốiTạo mới
"x"Tạo mới❌ FileExistsErrorTạo mới
"r+"Đọc + ghiGhi đè 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òng open("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áchBộ nhớ dùngDùng khi
read()Toàn bộ file vào RAMFile < 10 MB
Vòng lặp forMột dòngFile lớn bất kỳ
readlines()Toàn bộ fileCầ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ỗiNguyên nhânCách xử lý
FileNotFoundErrorFile không tồn tạiKiểm tra Path.exists() trước
PermissionErrorFile đang mở ở chương trình khácĐóng Excel/Word trước
UnicodeDecodeErrorSai encodingThử utf-8-sig, cp1252, latin-1
IsADirectoryErrorĐường dẫn là thư mụcKiể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:

Mở trên Colab

📺 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!