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

Xử Lý File & Ngoại Lệ

Giai đoạn 3 – Nâng Cao & Thực Hành · Mục tiêu: Đọc/ghi file text, CSV, JSON và bắt lỗi ngoại lệ.


1. Đọc / Ghi File văn bản

Chế độ mở file

Chế độÝ nghĩaFile phải tồn tại?
"r"Đọc
"w"Ghi (ghi đè)Tự tạo
"a"Ghi thêm (append)Tự tạo
"x"Tạo mới (lỗi nếu đã có)Tự tạo

Ghi file

with open("ghi_chu.txt", "w", encoding="utf-8") as f:
f.write("Dòng 1: Xin chào Python!\n")
f.write("Dòng 2: Đây là file văn bản.\n")

# Ghi thêm
with open("ghi_chu.txt", "a", encoding="utf-8") as f:
f.write("Dòng 3: Thêm nội dung mới.\n")

:::info Tại sao dùng with? with tự động đóng file khi thoát khối lệnh, kể cả khi có lỗi. :::

Đọc file

# Đọc toàn bộ
with open("ghi_chu.txt", "r", encoding="utf-8") as f:
noi_dung = f.read()

# Đọc từng dòng
with open("ghi_chu.txt", "r", encoding="utf-8") as f:
for dong in f:
print(dong.strip())

# Đọc tất cả dòng → list
with open("ghi_chu.txt", "r", encoding="utf-8") as f:
cac_dong = f.readlines()

Kiểm tra file tồn tại

import os
os.path.exists("ghi_chu.txt") # True/False

2. File CSV

import csv

# Ghi CSV
data = [
["Mã HS", "Họ tên", "Điểm"],
["HS001", "Nguyễn Văn An", 8.5],
["HS002", "Trần Thị Bình", 7.2],
]

with open("hoc_sinh.csv", "w", encoding="utf-8-sig", newline="") as f:
csv.writer(f).writerows(data)

# Đọc CSV
with open("hoc_sinh.csv", "r", encoding="utf-8-sig") as f:
reader = csv.reader(f)
next(reader) # Bỏ tiêu đề
for row in reader:
print(row)

DictReader / DictWriter

import csv

# Ghi
with open("sv.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["ma", "ten", "diem"])
writer.writeheader()
writer.writerow({"ma": "SV001", "ten": "Vũ", "diem": 8.5})

# Đọc
with open("sv.csv", "r", encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
print(f"{row['ten']}: {row['diem']}")

3. File JSON

import json

du_lieu = {
"truong": "THPT ABC",
"hoc_sinh": [
{"ten": "An", "diem": 8.5},
{"ten": "Bình", "diem": 7.2},
]
}

# Ghi JSON
with open("truong.json", "w", encoding="utf-8") as f:
json.dump(du_lieu, f, ensure_ascii=False, indent=2)

# Đọc JSON
with open("truong.json", "r", encoding="utf-8") as f:
data = json.load(f)

# Dict JSON string
json_str = json.dumps(du_lieu, ensure_ascii=False)
d = json.loads(json_str)

4. Xử lý ngoại lệ

Try / Except

try:
so = int(input("Nhập số: "))
kq = 100 / so
print(f"Kết quả: {kq}")
except ValueError:
print(" Nhập số nguyên!")
except ZeroDivisionError:
print(" Không chia cho 0!")

Try / Except / Else / Finally

try:
f = open("data.txt", "r", encoding="utf-8")
nd = f.read()
except FileNotFoundError:
print(" File không tồn tại!")
else:
print(f" Đọc thành công: {len(nd)} ký tự")
finally:
print(" Hoàn tất") # Luôn chạy

Các Exception phổ biến

ExceptionNguyên nhânVí dụ
ValueErrorGiá trị không hợp lệint("abc")
TypeErrorSai kiểu"hello" + 5
ZeroDivisionErrorChia cho 010 / 0
IndexErrorIndex vượt[1,2][5]
KeyErrorKey không có{"a":1}["b"]
FileNotFoundErrorFile không tìm thấyopen("abc.txt")

Raise Exception

def kiem_tra_tuoi(tuoi):
if tuoi < 0:
raise ValueError("Tuổi không thể âm!")
return tuoi

try:
kiem_tra_tuoi(-5)
except ValueError as e:
print(f" {e}")

Bài tập thực hành

Trắc nghiệm

  1. Chế độ "a" trong open() làm gì?

    • A. Ghi đè
    • B. Ghi thêm vào cuối
    • C. Chỉ đọc
    • D. Tạo mới, lỗi nếu đã có
  2. finally khi nào được thực thi?

    • A. Chỉ khi có lỗi
    • B. Chỉ khi không lỗi
    • C. Luôn luôn
    • D. Tuỳ trường hợp

Thực hành

  1. Đọc file text → đếm số dòng, số từ, số ký tự.
  2. Quản lý danh bạ lưu vào file CSV.
  3. Nhập danh sách sản phẩm → lưu file JSON → đọc lại.
  4. Nhập liệu an toàn: lặp yêu cầu nhập đến khi đúng kiểu (try/except).

Quay lại: Roadmap · Bài tiếp: Bài 11 – OOP