Trong hành trình học Python, có một chủ đề mà sớm muộn gì chúng ta cũng sẽ gặp: làm việc với file. Dù là đọc dữ liệu từ một file văn bản đơn giản, phân tích hàng nghìn dòng log, hay xử lý một tệp nhị phân như ảnh hoặc âm thanh, thao tác đọc file luôn là bước mở đầu quan trọng.
Có thể lúc đầu, ta nghĩ rằng việc đọc file chỉ cần một lệnh duy nhất. Nhưng khi tìm hiểu sâu hơn, sẽ thấy Python cung cấp rất nhiều cách thức khác nhau — mỗi cách lại có ưu điểm, hạn chế và tình huống áp dụng riêng. Chính sự đa dạng này khiến việc đọc file trong Python vừa thú vị, vừa đòi hỏi chúng ta nắm rõ để sử dụng đúng lúc.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu toàn bộ các kỹ thuật đọc file trong Python: từ những phương thức cơ bản như read()
, readline()
, đến việc sử dụng context manager with open()
, đọc file lớn theo từng phần, xử lý file nhị phân, cũng như những “best practices” để tránh lỗi thường gặp
1. Tổng quan về đọc file trong Python
Trước khi đi vào các phương thức cụ thể, chúng ta cần thống nhất một số khái niệm cơ bản.
File trên máy tính được chia thành hai loại chính:
- Text file: chứa dữ liệu văn bản, có thể đọc được bằng mắt thường, thường dùng encoding như UTF-8 hoặc ASCII. Ví dụ:
.txt
,.csv
,.json
. - Binary file: chứa dữ liệu nhị phân (0 và 1), không thể hiểu trực tiếp nếu mở bằng text editor. Ví dụ:
.jpg
,.mp3
,.exe
.
Trong Python, thao tác đọc file thường bắt đầu bằng hàm open()
. Cú pháp phổ biến:
open(file, mode='r', encoding=None)
Trong đó:
file
: đường dẫn tới file cần mở.mode
: chế độ mở file (r
,rb
,w
,a
, …).encoding
: kiểu mã hóa, quan trọng khi đọc file văn bản.
Một số chế độ hay dùng khi đọc file:
'r'
: đọc văn bản.'rb'
: đọc file nhị phân.
Như vậy, có thể thấy Python cung cấp sự linh hoạt ngay từ bước đầu tiên — tùy loại file, chúng ta cần lựa chọn chế độ thích hợp.
2. Phương thức cơ bản để đọc file
Sau khi mở file, Python hỗ trợ nhiều cách đọc khác nhau. Mỗi cách có ưu điểm và nhược điểm riêng.
2.1 read()
– đọc toàn bộ nội dung
with open("example.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content[:100]) # print first 100 characters
- Ưu điểm: đơn giản, dễ hiểu, thích hợp cho file nhỏ.
- Nhược điểm: nếu file lớn (vài trăm MB hoặc hơn),
read()
sẽ chiếm rất nhiều bộ nhớ.
2.2 readline()
– đọc từng dòng một
with open("example.txt", "r", encoding="utf-8") as f:
line = f.readline()
while line:
print(line.strip())
line = f.readline()
- Ưu điểm: cho phép xử lý từng dòng, không lo tràn bộ nhớ.
- Nhược điểm: cần viết vòng lặp thủ công, ít “Pythonic” hơn.
2.3 readlines()
– đọc tất cả dòng thành list
with open("example.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print("Number of lines:", len(lines))
- Ưu điểm: rất tiện khi cần danh sách các dòng.
- Nhược điểm: cũng load toàn bộ file vào bộ nhớ, giống
read()
.
2.4 Iteration – vòng lặp for line in file
with open("example.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
Đây được coi là cách Pythonic nhất để đọc từng dòng — gọn gàng, an toàn, và tiết kiệm bộ nhớ.
3. Quản lý file bằng context manager (with open()
)
Một trong những best practice khi làm việc với file trong Python là sử dụng context manager.
with open("data.txt", "r", encoding="utf-8") as f:
data = f.read()
print("Done reading")
Khi dùng with open()
, Python tự động đóng file sau khi khối lệnh kết thúc — kể cả khi xảy ra lỗi. Điều này giúp chúng ta tránh tình trạng quên đóng file hoặc rò rỉ tài nguyên.
Nếu dùng cách cũ:
f = open("data.txt", "r", encoding="utf-8")
data = f.read()
f.close()
Trong trường hợp xảy ra exception giữa read()
và close()
, file có thể không được đóng đúng cách. Vì vậy, with open()
luôn được khuyến khích dùng.
4. Đọc file với kích thước lớn
Một vấn đề thực tế: khi file quá lớn, không thể read()
hết một lần. Giải pháp là đọc dần từng phần.
Đọc từng dòng
with open("large.txt", "r", encoding="utf-8") as f:
for line in f:
process(line) # process each line
Đọc theo chunk (theo số byte/ký tự)
with open("large.txt", "r", encoding="utf-8") as f:
while True:
chunk = f.read(1024) # read 1024 characters
if not chunk:
break
process(chunk)
Việc đọc từng phần giúp tiết kiệm bộ nhớ, phù hợp cho xử lý dữ liệu lớn như log server, dữ liệu AI, hay các file CSV khổng lồ.
5. Làm việc với file nhị phân (binary file)
Khác với text file, file nhị phân cần mở với chế độ 'rb'
.
with open("image.jpg", "rb") as f:
data = f.read()
print("File size (bytes):", len(data))
Trong trường hợp này, data
là kiểu bytes
. Thao tác trên bytes
khác với str
, do đó thường cần dùng thêm các thư viện chuyên dụng:
Pillow
để xử lý ảnh.wave
hoặcpydub
để xử lý âm thanh.pickle
hoặcstruct
để giải mã dữ liệu nhị phân có cấu trúc.
6. Xử lý ngoại lệ khi đọc file
Trong thực tế, rất dễ gặp lỗi khi đọc file:
- File không tồn tại (
FileNotFoundError
). - Không đủ quyền truy cập (
PermissionError
). - Sai encoding (
UnicodeDecodeError
).
Ví dụ xử lý an toàn:
try:
with open("unknown.txt", "r", encoding="utf-8") as f:
content = f.read()
except FileNotFoundError:
print("File not found")
except PermissionError:
print("You don't have permission to read this file")
except UnicodeDecodeError:
print("Encoding error, try another encoding or use binary mode")
Việc chủ động xử lý ngoại lệ giúp chương trình không bị crash đột ngột và dễ debug hơn.
7. Thực tiễn tốt khi đọc file trong Python
Một số nguyên tắc nên áp dụng:
- Luôn dùng
with open()
. - Chỉ định rõ
encoding="utf-8"
cho file văn bản để tránh lỗi khi chạy trên nhiều hệ điều hành. - Không đọc toàn bộ file vào bộ nhớ nếu không cần thiết.
- Sử dụng
pathlib
thay vìos.path
để xử lý đường dẫn rõ ràng hơn.
Ví dụ với pathlib
:
from pathlib import Path
path = Path("data") / "example.txt"
with path.open("r", encoding="utf-8") as f:
print(f.readline())
8. Ứng dụng thực tế
8.1 Đọc file CSV
import csv
with open("data.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["name"], row["age"])
8.2 Đọc file JSON
import json
with open("config.json", "r", encoding="utf-8") as f:
config = json.load(f)
print(config.get("database"))
8.3 Phân tích file log
with open("app.log", "r", encoding="utf-8") as f:
for line in f:
if "ERROR" in line:
print("Error found:", line.strip())
Những ví dụ này minh họa cách áp dụng kiến thức đọc file trong các tình huống đời thực.
9. Kết luận
Qua bài viết này, chúng ta đã cùng nhau đi qua một hành trình khá toàn diện về cách đọc file trong Python. Từ những phương thức cơ bản như read()
, readline()
cho đến việc đọc toàn bộ dòng bằng readlines()
, hay cách xử lý hiệu quả hơn với with open()
, đọc file lớn theo từng phần, và cả đọc file nhị phân. Mỗi kỹ thuật đều có ưu điểm, nhược điểm riêng và phù hợp cho từng tình huống cụ thể.
Điều quan trọng không chỉ là biết “làm thế nào để đọc file”, mà còn là hiểu khi nào nên dùng cách nào, tránh lạm dụng những phương pháp có thể gây ra lỗi hoặc tốn tài nguyên. Đồng thời, việc áp dụng các thực tiễn tốt như luôn sử dụng with open()
, đặt chế độ mở file đúng mục đích, hay quản lý dữ liệu lớn bằng cách đọc từng phần sẽ giúp chương trình của chúng ta chạy an toàn và hiệu quả hơn.
10. Tài liệu tham khảo
[1] Python Software Foundation, “Built-in Functions — open
,” Python Documentation. [Online]. Available: https://docs.python.org/3/library/functions.html#open. [Accessed: Oct. 1, 2025].
[2] Python Software Foundation, “Reading and Writing Files,” Python Tutorial. [Online]. Available: https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files. [Accessed: Oct. 1, 2025].
[3] Real Python, “Reading and Writing Files in Python,” Real Python. [Online]. Available: https://realpython.com/read-write-files-python/. [Accessed: Oct. 1, 2025].