Bài 12 – Làm Việc Với File Trong Python

Giới thiệu: Làm việc với file là kỹ năng quan trọng trong lập trình, cho phép lưu trữ và truy xuất dữ liệu một cách bền vững. Python cung cấp các công cụ mạnh mẽ và dễ sử dụng để đọc, ghi và quản lý file.

Mục tiêu bài học:
– Hiểu cách mở và đóng file an toàn trong Python
– Thành thạo các phương thức đọc và ghi file văn bản
– Nắm vững các chế độ làm việc với file khác nhau
– Xử lý được file CSV và JSON
– Áp dụng vào các tình huống thực tế


1. Mở Và Đóng File

Cú pháp mở file:

file_object = open('tên_file', 'chế_độ')

Các chế độ mở file phổ biến:

  • 'r' – Read (mặc định): Mở file để đọc
  • 'w' – Write: Mở file để ghi (ghi đè nếu file tồn tại)
  • 'a' – Append: Mở file để ghi thêm vào cuối
  • 'x' – Create: Tạo file mới
  • 'b' – Binary: Chế độ nhị phân
  • 't' – Text: Chế độ văn bản (mặc định)

Sử dụng with statement (khuyến nghị):

with open('filename.txt', 'r') as file:
    # Thao tác với file
    # File tự động đóng khi ra khỏi khối with

2. Đọc File Văn Bản

Đọc toàn bộ nội dung:

with open('data.txt', 'r') as file:
    content = file.read()
    print(content)

Đọc từng dòng:

# Đọc toàn bộ các dòng vào list
with open('data.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

# Đọc từng dòng bằng vòng lặp
with open('data.txt', 'r') as file:
    for line in file:
        print(line.strip())

Đọc một số ký tự nhất định:

with open('data.txt', 'r') as file:
    first_100_chars = file.read(100)
    print(first_100_chars)

3. Ghi File Văn Bản

Ghi đè file:

with open('output.txt', 'w') as file:
    file.write("Dòng đầu tiên\n")
    file.write("Dòng thứ hai\n")

Ghi thêm vào file:

with open('output.txt', 'a') as file:
    file.write("Dòng được thêm vào cuối\n")

Ghi nhiều dòng cùng lúc:

lines = ["Dòng 1\n", "Dòng 2\n", "Dòng 3\n"]
with open('output.txt', 'w') as file:
    file.writelines(lines)

4. Xử Lý Lỗi Với File

Sử dụng try-except:

try:
    with open('file_khong_ton_tai.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("File không tồn tại!")
except PermissionError:
    print("Không có quyền truy cập file!")
except Exception as e:
    print(f"Lỗi: {e}")

5. Làm Việc Với File CSV

Sử dụng module csv:

import csv

# Ghi file CSV
with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Tên', 'Tuổi', 'Điểm'])
    writer.writerow(['Nguyễn Văn A', 20, 8.5])
    writer.writerow(['Trần Thị B', 21, 7.8])

# Đọc file CSV
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

Sử dụng DictReader/DictWriter:

import csv

# Ghi với DictWriter
with open('students.csv', 'w', newline='') as file:
    fieldnames = ['name', 'age', 'grade']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'name': 'Alice', 'age': 20, 'grade': 8.5})
    writer.writerow({'name': 'Bob', 'age': 21, 'grade': 7.8})

# Đọc với DictReader
with open('students.csv', 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(f"{row['name']} - {row['age']} tuổi - Điểm: {row['grade']}")

6. Làm Việc Với File JSON

Ghi file JSON:

import json

data = {
    "students": [
        {"name": "Alice", "age": 20, "subjects": ["Math", "Physics"]},
        {"name": "Bob", "age": 21, "subjects": ["Chemistry", "Biology"]}
    ]
}

with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=2)

Đọc file JSON:

import json

with open('data.json', 'r', encoding='utf-8') as file:
    data = json.load(file)
    for student in data['students']:
        print(f"{student['name']} - {student['age']} tuổi")

7. Các Thao Tác File Khác

Kiểm tra file tồn tại:

import os

if os.path.exists('file.txt'):
    print("File tồn tại")
else:
    print("File không tồn tại")

Đổi tên file:

import os

os.rename('old_name.txt', 'new_name.txt')

Xóa file:

import os

os.remove('file_to_delete.txt')

8. Ứng Dụng Thực Tế

Ví dụ 8.1: Ghi nhật ký ứng dụng

import datetime

def write_log(message):
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open('app.log', 'a') as file:
        file.write(f"[{timestamp}] {message}\n")

write_log("Ứng dụng khởi động")
write_log("Người dùng đăng nhập")

Ví dụ 8.2: Đọc cấu hình từ file

def read_config(filename):
    config = {}
    with open(filename, 'r') as file:
        for line in file:
            if '=' in line and not line.startswith('#'):
                key, value = line.strip().split('=', 1)
                config[key] = value
    return config

config = read_config('config.txt')
print(config)

Ví dụ 8.3: Sao chép file

def copy_file(source, destination):
    try:
        with open(source, 'r') as src, open(destination, 'w') as dest:
            content = src.read()
            dest.write(content)
        print("Sao chép thành công!")
    except FileNotFoundError:
        print("File nguồn không tồn tại!")
    except Exception as e:
        print(f"Lỗi: {e}")

copy_file('source.txt', 'copy.txt')

Bài Tập Thực Hành (Tự Giải)

Bài 1: Viết chương trình đếm số dòng trong file

Bài 2: Viết chương trình tìm và thay thế từ trong file

Bài 3: Tạo chương trình ghi danh sách sinh viên vào CSV

Bài 4: Viết chương trình đọc file JSON và tính điểm trung bình

Bài 5: Tạo chương trình backup file tự động

Bài 6: Viết chương trình nối nhiều file thành một

Bài 7: Tạo chương trình quản lý cấu hình với file

Bài 8: Viết chương trình đếm tần suất từ trong file văn bản

Bài 9: Tạo chương trình ghi log hệ thống

Bài 10: Viết chương trình kiểm tra định dạng file

Lưu Ý Quan Trọng

  1. Luôn đóng file: Sử dụng with statement để đảm bảo file được đóng
  2. Xử lý encoding: Chỉ định encoding khi làm việc với tiếng Việt
  3. Xử lý lỗi: Luôn dùng try-except khi làm việc với file
  4. Quyền truy cập: Kiểm tra quyền đọc/ghi trước khi thao tác
  5. Quản lý bộ nhớ: Với file lớn, đọc từng phần thay vì toàn bộ

Tóm Tắt

  • Mở file với các chế độ phù hợp cho từng mục đích
  • Đọc file toàn bộ, từng dòng, hoặc từng phần
  • Ghi file với write() hoặc writelines()
  • Xử lý CSV/JSON với các module chuyên dụng
  • Quản lý file với các hàm trong module os
  • Xử lý lỗi để chương trình hoạt động ổn định

Comments are closed.