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ĩa | File 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
| Exception | Nguyên nhân | Ví dụ |
|---|---|---|
ValueError | Giá trị không hợp lệ | int("abc") |
TypeError | Sai kiểu | "hello" + 5 |
ZeroDivisionError | Chia cho 0 | 10 / 0 |
IndexError | Index vượt | [1,2][5] |
KeyError | Key không có | {"a":1}["b"] |
FileNotFoundError | File không tìm thấy | open("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
-
Chế độ
"a"trongopen()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ó
-
finallykhi 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
- Đọc file text → đếm số dòng, số từ, số ký tự.
- Quản lý danh bạ lưu vào file CSV.
- Nhập danh sách sản phẩm → lưu file JSON → đọc lại.
- 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