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