Giới thiệu về thao tác file trong Python
Bạn có biết rằng thao tác file là một trong những kỹ năng quan trọng nhất khi lập trình Python không? Dù bạn đang xây dựng ứng dụng web, phân tích dữ liệu hay tạo công cụ tự động hóa, việc đọc và ghi file sẽ xuất hiện trong hầu hết mọi dự án.

Vấn đề mà nhiều bạn mới học Python gặp phải là cảm thấy bối rối khi tiếp cận file handling. Tại sao lại có nhiều cách đọc file khác nhau? Khi nào nên dùng mode nào? Làm sao để tránh mất dữ liệu khi ghi file? Những câu hỏi này hoàn toàn bình thường và tôi từng trải qua giai đoạn này.
Trong bài viết này, tôi sẽ hướng dẫn bạn từng bước cách làm việc với file trong Python một cách hiệu quả và an toàn. Chúng ta sẽ bắt đầu từ những thao tác cơ bản như mở và đóng file, sau đó tiến đến các kỹ thuật nâng cao như di chuyển con trỏ file và xử lý lỗi. Mỗi phần đều có ví dụ cụ thể mà bạn có thể thực hành ngay lập tức.
Các bước cơ bản làm việc với file
Mở file với hàm open() và các mode phổ biến
Hàm open()
là cửa ngõ để bạn làm việc với file trong Python. Cú pháp cơ bản của nó khá đơn giản:
file = open('ten_file.txt', 'r')
# Thực hiện thao tác với file
file.close()

Các mode phổ biến mà bạn cần nhớ:
r
(read): Chỉ đọc file, con trỏ ở đầu file
w
(write): Ghi file, xóa nội dung cũ nếu file tồn tại
a
(append): Thêm nội dung vào cuối file
x
(exclusive creation): Tạo file mới, báo lỗi nếu file đã tồn tại
t
(text): Làm việc với file văn bản (mặc định)
b
(binary): Làm việc với file nhị phân
Ví dụ thực tế:
# Đọc file văn bản
file_text = open('data.txt', 'rt')
# Ghi file nhị phân
file_binary = open('image.jpg', 'wb')
# Thêm nội dung vào file log
file_log = open('app.log', 'a')
Đóng file và sử dụng context manager
Việc đóng file sau khi sử dụng rất quan trọng để giải phóng tài nguyên hệ thống. Tuy nhiên, cách tốt nhất là sử dụng context manager với từ khóa with
:
# Cách truyền thống (không khuyến khích)
file = open('data.txt', 'r')
content = file.read()
file.close() # Dễ quên đóng file
# Cách tốt nhất với context manager
with open('data.txt', 'r') as file:
content = file.read()
# File tự động đóng khi thoát khỏi block with

Context manager đảm bảo file luôn được đóng, ngay cả khi xảy ra lỗi trong quá trình xử lý. Để hiểu rõ hơn về cách tổ chức mã hiệu quả trong Python, bạn có thể tham khảo thêm Hàm trong Python: Định nghĩa, Cách khai báo, Sử dụng và Mẹo Tối ưu.
Đọc dữ liệu từ file
Các phương thức đọc: read(), readline(), readlines()
Python cung cấp ba phương thức chính để đọc dữ liệu từ file, mỗi phương thức phù hợp với trường hợp sử dụng khác nhau:
1. Phương thức read():
with open('data.txt', 'r', encoding='utf-8') as file:
content = file.read() # Đọc toàn bộ file
print(content)
Phương thức này đọc toàn bộ nội dung file vào bộ nhớ. Hữu ích với file nhỏ, nhưng cần cẩn thận với file lớn vì có thể gây tràn bộ nhớ.
2. Phương thức readline():
with open('data.txt', 'r', encoding='utf-8') as file:
first_line = file.readline() # Đọc một dòng
second_line = file.readline() # Đọc dòng tiếp theo

3. Phương thức readlines():
with open('data.txt', 'r', encoding='utf-8') as file:
lines = file.readlines() # Đọc tất cả dòng vào list
for line in lines:
print(line.strip()) # strip() để loại bỏ ký tự xuống dòng
Đọc file văn bản vs file nhị phân
Khi làm việc với file văn bản, bạn thường sử dụng encoding UTF-8 để đảm bảo hiển thị đúng tiếng Việt:
# Đọc file văn bản tiếng Việt
with open('dulieu.txt', 'r', encoding='utf-8') as file:
noidung = file.read()
print(noidung)
Với file nhị phân như ảnh, âm thanh, video:
# Đọc file ảnh
with open('anh.jpg', 'rb') as file:
image_data = file.read()
print(f"Kích thước file: {len(image_data)} bytes")

Để hiểu sâu hơn về các kiểu dữ liệu trong Python, bạn có thể xem bài viết Tìm hiểu các kiểu dữ liệu trong Python và cách sử dụng hiệu quả.
Ghi và cập nhật file
Sử dụng write() và writelines()
Việc ghi dữ liệu vào file cũng quan trọng không kém việc đọc. Python cung cấp hai phương thức chính:
1. Phương thức write():
# Ghi một chuỗi vào file
with open('output.txt', 'w', encoding='utf-8') as file:
file.write("Đây là dòng đầu tiên\n")
file.write("Đây là dòng thứ hai\n")
2. Phương thức writelines():
# 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', encoding='utf-8') as file:
file.writelines(lines)
Chế độ append và overwrite
Sự khác biệt giữa mode w
và a
rất quan trọng:
Mode ‘w’ (overwrite):
# Ghi đè lên file cũ
with open('log.txt', 'w') as file:
file.write("Nội dung mới - xóa hết nội dung cũ\n")
Mode ‘a’ (append):
# Thêm vào cuối file, giữ nguyên nội dung cũ
with open('log.txt', 'a') as file:
file.write("Thêm dòng này vào cuối file\n")

Ví dụ thực tế với file log hệ thống:
import datetime
def ghi_log(message):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open('system.log', 'a', encoding='utf-8') as file:
file.write(f"[{timestamp}] {message}\n")
# Sử dụng
ghi_log("Hệ thống khởi động")
ghi_log("Người dùng đăng nhập thành công")
Các phương pháp nâng cao và xử lý lỗi
Di chuyển con trỏ file với seek() và tell()
Khi làm việc với file lớn, bạn có thể cần di chuyển đến vị trí cụ thể:
with open('data.txt', 'r+') as file:
print(f"Vị trí ban đầu: {file.tell()}") # Vị trí hiện tại
file.seek(10) # Di chuyển đến byte thứ 10
print(f"Vị trí sau khi seek: {file.tell()}")
content = file.read(5) # Đọc 5 ký tự từ vị trí hiện tại
print(f"Nội dung: {content}")
Xử lý buffer và truncate()
Đôi khi bạn cần kiểm soát việc ghi dữ liệu vào disk:
with open('temp.txt', 'w') as file:
file.write("Dữ liệu quan trọng")
file.flush() # Buộc ghi ngay lập tức vào disk
file.seek(0) # Về đầu file
file.truncate(5) # Cắt file chỉ còn 5 ký tự đầu

Xóa, đổi tên, sao chép file với os và shutil
Ngoài thao tác đọc ghi, bạn cũng cần quản lý file:
import os
import shutil
# Xóa file
if os.path.exists('temp.txt'):
os.remove('temp.txt')
print("Đã xóa file temp.txt")
# Đổi tên file
os.rename('old_name.txt', 'new_name.txt')
# Sao chép file
shutil.copy('source.txt', 'backup.txt')
# Sao chép với metadata
shutil.copy2('source.txt', 'backup_full.txt')
Xử lý lỗi thường gặp
Luôn luôn xử lý lỗi khi làm việc với file:
def doc_file_an_toan(ten_file):
try:
with open(ten_file, 'r', encoding='utf-8') as file:
return file.read()
except FileNotFoundError:
print(f"Không tìm thấy file: {ten_file}")
return None
except PermissionError:
print(f"Không có quyền truy cập file: {ten_file}")
return None
except Exception as e:
print(f"Lỗi không xác định: {e}")
return None
# Sử dụng
noi_dung = doc_file_an_toan('data.txt')
if noi_dung:
print("Đọc file thành công!")

Best practices khi làm việc với file
Sau nhiều năm làm việc với Python, tôi muốn chia sẻ một số thực hành tốt:
1. Luôn sử dụng context manager:
# Tốt
with open('file.txt', 'r') as f:
data = f.read()
# Không tốt
f = open('file.txt', 'r')
data = f.read()
f.close() # Có thể quên
2. Chỉ định encoding rõ ràng:
# Tránh vấn đề với ký tự tiếng Việt
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
3. Kiểm tra tồn tại file trước khi xử lý:
import os
if os.path.exists('important_data.txt'):
with open('important_data.txt', 'r') as f:
data = f.read()
else:
print("File không tồn tại!")

4. Xử lý file lớn hiệu quả:
# Với file lớn, đọc từng dòng thay vì đọc toàn bộ
def xu_ly_file_lon(ten_file):
with open(ten_file, 'r') as f:
for dong in f: # Đọc từng dòng một
# Xử lý dòng tại đây
dong_sach = dong.strip()
if dong_sach:
print(f"Xử lý: {dong_sach}")
Phương pháp đọc từng dòng giúp bạn áp dụng hiệu quả trong các trường hợp cần xử lý dữ liệu lớn, liên quan mật thiết đến vòng lặp trong Python để lặp qua dữ liệu một cách linh hoạt.
Kết luận
Thao tác file trong Python không phải là kiến thức khó, nhưng để làm tốt cần hiểu rõ từng phương thức và biết khi nào nên áp dụng. Từ những thao tác cơ bản như mở, đọc, ghi file cho đến các kỹ thuật nâng cao như di chuyển con trỏ và xử lý lỗi – tất cả đều có vai trò quan trọng trong việc xây dựng ứng dụng ổn định.
Điểm quan trọng nhất tôi muốn nhấn mạnh là luôn sử dụng context manager với từ khóa with
. Nó không chỉ giúp code sạch hơn mà còn đảm bảo tài nguyên được giải phóng đúng cách. Đừng quên xử lý lỗi và chỉ định encoding khi làm việc với file tiếng Việt.

Thực hành là cách tốt nhất để nắm vững kiến thức này. Hãy bắt đầu với những ví dụ đơn giản trong bài viết, sau đó áp dụng vào dự án thực tế của bạn. Nếu bạn cần tìm hiểu sâu hơn về Python, đừng quên tham khảo tài liệu chính thức và các khóa học chuyên sâu. Bạn cũng có thể tham khảo thêm Kiểu dữ liệu trong Python và Hàm trong Python để nâng cao kỹ năng lập trình.
Để hỗ trợ học tập hiệu quả hơn, bạn có thể tải về bộ tài liệu Python miễn phí tại đây: Chia sẻ Tài liệu học Python.