Bắt đầu: Lần đầu ghi tệp trong Python
Cách nhanh nhất để hiểu việc ghi tệp trong Python là bắt tay vào làm. Hãy bắt đầu với ví dụ đơn giản nhất và xây dựng dần từ đó.
Mẫu cơ bản (từng bước)
Về cốt lõi, ghi vào tệp theo một mẫu đơn giản:
- Mở một tệp
- Ghi nội dung vào đó
- Đóng tệp
Python cung cấp hàm tích hợp open() để xử lý bước đầu tiên.
Hàm open(), giải thích đơn giản
Hàm open() kết nối mã Python của bạn với một tệp trên đĩa. Bạn cho nó biết hai điều:
- Bạn muốn làm việc với tệp nào
- Bạn muốn làm việc với tệp đó như thế nào
Để ghi, chế độ phổ biến nhất là "w", nghĩa là write (ghi). Nếu tệp chưa tồn tại, Python sẽ tạo mới. Nếu đã tồn tại, Python sẽ ghi đè.
file = open("example.txt", "w")
file.write("Hello, world!")
file.close()
Chạy script này, và Python sẽ tạo một tệp tên example.txt trong cùng thư mục với mã của bạn.
Vậy vừa rồi có gì xảy ra?
-
open("example.txt", "w")mở hoặc tạo tệp -
write()gửi văn bản vào tệp -
close()ghi xả dữ liệu và giải phóng tệp
Cách này hoạt động, nhưng không phải cách bạn nên dùng lâu dài.
Cách đúng trong Python: Dùng Context Manager
Tự mở và đóng tệp rất dễ quên và dễ làm sai. Đó là lý do Python khuyến khích dùng context manager.
Vì sao dùng with lại tốt hơn: Sử dụng with đảm bảo tệp luôn được đóng đúng cách, ngay cả khi có sự cố trong lúc ghi. Nó giúp mã của bạn an toàn và dễ đọc hơn.
with open("example.txt", "w") as file:
file.write("Hello, world!")
Khi khối with kết thúc, Python tự động đóng tệp. Mẫu này xuất hiện ở khắp nơi trong mã Python chuyên nghiệp và rất đáng ghi nhớ. Bạn sẽ thấy nó lặp đi lặp lại trong Python Programming skill track và khóa Writing Clean Python Code của chúng tôi.
Ví dụ ghi tệp trong Python
Hãy áp dụng vào thứ gì đó thực tế hơn một chút. Ở đây tôi sẽ tạo một mục nhật ký hằng ngày.
from datetime import date
today = date.today().isoformat()
with open("journal.txt", "a", encoding="utf-8") as file:
file.write(f"{today}: Practiced writing files in Python.\n")
Ví dụ này giới thiệu hai ý quan trọng:
-
Chế độ nối thêm (
"a") -
Ghi các mục có cấu trúc, lặp lại
-
Mỗi lần chạy sẽ thêm một dòng mới mà không xóa các mục trước đó.
Hiểu các chế độ tệp: Khi nào dùng w, a, x và r+
Khi bạn đã biết cách ghi vào tệp, quyết định quan trọng nhất là mở nó như thế nào. Chế độ tệp kiểm soát dữ liệu bị ghi đè, được giữ lại hay được bảo vệ.
Chế độ ghi (w): Bắt đầu mới
Chế độ ghi sẽ tạo tệp nếu chưa tồn tại. Nó cũng sẽ ghi đè nếu tệp đã tồn tại.
with open("report.txt", "w") as file:
file.write("Daily sales report\n")
Dùng khi bạn muốn một bản trắng tinh. Hãy cẩn thận vì chế độ này xóa dữ liệu hiện có một cách im lặng.
Chế độ nối thêm (a): Thêm mà không mất dữ liệu
Chế độ nối thêm sẽ thêm nội dung vào cuối tệp.
with open("activity.log", "a") as file:
file.write("User logged in\n")
Lý tưởng cho nhật ký và bản ghi tăng dần, và là một trong những chế độ an toàn nhất cho hệ thống sản xuất.
Chế độ tạo độc quyền (x): Tạo tệp an toàn
Chế độ độc quyền chỉ tạo tệp nếu nó chưa tồn tại.
try:
with open("config.txt", "x") as file:
file.write("initialized=true")
except FileExistsError:
print("File already exists.")
Hữu ích cho các script thiết lập nơi việc ghi đè sẽ rủi ro.
Chế độ đọc-ghi (r+): Sửa tệp hiện có
Chế độ này cho phép đọc và ghi nhưng yêu cầu tệp phải tồn tại.
with open("notes.txt", "r+") as file:
content = file.read()
file.write("\nNew note added.")
Ghi diễn ra tại vị trí con trỏ tệp hiện tại, đó là lý do việc hiểu di chuyển con trỏ rất quan trọng ở đây.
Vậy nên dùng chế độ nào? Đây là hướng dẫn tinh gọn trong đầu tôi:
-
Ghi đè dữ liệu hiện có →
w -
Giữ dữ liệu và thêm tiếp →
a -
Ngăn ghi đè →
x -
Đọc và cập nhật cùng một tệp →
r+
Để củng cố quy trình quyết định này một cách trực quan:

Chọn đúng chế độ tệp thường phụ thuộc vào ý định: ghi đè, nối thêm, bảo vệ hay chỉnh sửa.
Ghi các loại nội dung khác nhau trong Python
Khi bạn đã thoải mái mở tệp với chế độ phù hợp, câu hỏi tiếp theo là bạn thực sự đang ghi gì.
Trong các chương trình thực tế, bạn không phải lúc nào cũng ghi một chuỗi đơn. Bạn có thể đang lưu danh sách, xuất kết quả, hoặc làm việc với dữ liệu không phải văn bản như ảnh hoặc PDF. Trong phần này, bạn sẽ học cách ghi các loại nội dung khác nhau vào tệp một cách an toàn và hiệu quả.
Ghi văn bản và chuỗi
Trường hợp đơn giản nhất là ghi văn bản thuần. Python cung cấp hai phương thức chính: write() và writelines().
write() ghi đúng những gì bạn truyền vào, không tự động thêm dòng mới.
with open("example.txt", "w") as file:
file.write("First line\n")
file.write("Second line\n")
write() so với writelines()
Điểm khác biệt chính rất đơn giản: write() ghi từng chuỗi một, trong khi writelines() ghi một dãy chuỗi nguyên trạng; writelines() không thêm ký tự xuống dòng giúp bạn, vì vậy mỗi phần tử phải tự kết thúc bằng \n.
Trong thực tế, nhiều lập trình viên vẫn thích write() trong một vòng lặp vì dễ đọc hơn.
lines = ["One\n", "Two\n", "Three\n"]
with open("example.txt", "w") as file:
file.writelines(lines)
Ghi danh sách hiệu quả
items = ["apple", "banana", "cherry"]
content = "\n".join(items)
with open("fruits.txt", "w") as file:
file.write(content)
Ghép chuỗi trước giúp giảm số lần ghi đĩa lặp lại, điều này quan trọng với bộ dữ liệu lớn.
Ghi dữ liệu nhị phân
Chế độ nhị phân ("wb") là bắt buộc cho các tệp không phải văn bản.
binary_data = b"\x89PNG\r\n\x1a\n"
with open("image.bin", "wb") as file:
file.write(binary_data)
Làm việc với mã hóa trong Python (Vì sao văn bản của bạn bị lỗi)
Sự cố mã hóa là một trong những lỗi xử lý tệp phổ biến—và gây ức chế—nhất.
Luôn chỉ định UTF-8
Chỉ định mã hóa rõ ràng giúp tránh lỗi đa nền tảng và ký tự bị hỏng, như bạn thấy dưới đây:
with open("example.txt", "w", encoding="utf-8") as file:
file.write("Café, résumé, naïve")
Ví dụ thực tế: Văn bản đa ngôn ngữ
Rõ ràng ngay từ đầu sẽ giúp bạn tiết kiệm hàng giờ gỡ lỗi sau này. Ý tôi là như thế này:
customers = ["Ana García", "François Dupont", "Miyuki 山田"]
with open("customers.txt", "w", encoding="utf-8") as file:
for name in customers:
file.write(name + "\n")
Kỹ thuật ghi nâng cao trong Python
Khi bạn đã thoải mái ghi tệp trong Python, bộ vấn đề tiếp theo thường không phải là cách ghi mà là cách làm an toàn và hiệu quả. Tệp lớn, sự cố bất ngờ và nút thắt hiệu năng đều tạo ra các trường hợp biên mà ta chưa đề cập.
Xử lý tệp lớn với ghi theo khối
Ghi luồng giúp giữ mức sử dụng bộ nhớ thấp:
def generate_lines():
for i in range(1_000_000):
yield f"Line {i}\n"
with open("large.txt", "w", encoding="utf-8") as file:
for line in generate_lines():
file.write(line)
Ghi nguyên tử (atomic): Ngăn hỏng dữ liệu
Ý tưởng ở đây là ngăn ghi dở nếu chương trình sập giữa chừng cập nhật.
import os, tempfile
def atomic_write(path, content):
with tempfile.NamedTemporaryFile("w", delete=False) as tmp:
tmp.write(content)
os.replace(tmp.name, path)
Vượt ra ngoài tệp văn bản: Ghi JSON và CSV
Khi dữ liệu của bạn có cấu trúc, văn bản thuần không còn là lựa chọn tốt nhất. Python giúp bạn dễ dàng ghi các định dạng có cấu trúc phổ biến như JSON và CSV, để bạn có thể lưu dữ liệu theo cách dễ chia sẻ, kiểm tra và xử lý sau này.
Ghi JSON
Khi bạn làm việc với dict hoặc dữ liệu lồng nhau, JSON thường là định dạng tự nhiên nhất để ghi. Mô-đun json tích hợp của Python xử lý việc chuyển đổi cho bạn, nên bạn không cần tự định dạng chuỗi thủ công.
import json
data = {"id": 1, "name": "Jeremiah"}
with open("user.json", "w", encoding="utf-8") as file:
json.dump(data, file, indent=2)
Ghi CSV
Nếu dữ liệu của bạn dạng bảng và có khả năng được mở trong bảng tính hoặc công cụ BI, CSV phù hợp hơn. Mô-đun csv giúp bạn ghi các hàng một cách an toàn mà không cần lo về dấu phân tách hoặc trích dẫn.
import csv
rows = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
with open("users.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["id", "name"])
writer.writeheader()
writer.writerows(rows)
Những lỗi thường gặp khi ghi tệp trong Python
Mặc dù ghi tệp trong Python khá đơn giản, một vài lỗi nhỏ lại gây ra hầu hết vấn đề thực tế. Các vấn đề này thường không liên quan đến cú pháp; chúng đến từ những chi tiết bị bỏ qua như quản lý tài nguyên, chế độ tệp hoặc lựa chọn hiệu năng.
Hãy ghi nhớ các điểm sau.
-
Quên đóng tệp → dùng
‘with’ -
Vô tình ghi đè dữ liệu → kiểm tra kỹ chế độ
-
Bỏ qua mã hóa → luôn chỉ định UTF-8
-
Ghi tệp lớn không hiệu quả → gom lô hoặc ghi luồng
Hầu hết lỗi ở đây đến từ những sơ suất nhỏ, không phải logic phức tạp.
Kết luận
Ghi vào tệp trong Python bắt đầu đơn giản, nhưng các chương trình thực tế đòi hỏi nhiều sự cẩn trọng hơn. Trong hướng dẫn này, bạn đã đi từ lần ghi tệp đầu tiên đến việc chọn chế độ tệp an toàn, xử lý mã hóa đúng cách, xuất dữ liệu có cấu trúc và áp dụng các mẫu sẵn sàng cho sản xuất.
Điều cốt lõi là ý định: chọn đúng chế độ, chỉ định rõ mã hóa và ghi một cách phòng vệ khi dữ liệu là quan trọng.

Nhà viết nội dung về công nghệ, chuyên về AI, ML và khoa học dữ liệu, giúp làm rõ và phổ biến những ý tưởng phức tạp.
Câu hỏi thường gặp
Python có thể ghi tệp bất đồng bộ không?
Có, với các thư viện như aiofiles, dù hầu hết script không cần đến.
Chế độ ghi nào an toàn nhất?
Nối thêm ("a") hoặc độc quyền ("x") tùy theo ý định.
Vì sao văn bản của tôi bị lỗi ký tự?
Lỗi không khớp mã hóa—hãy luôn dùng UTF-8.
Tệp của tôi được lưu ở đâu?
Tương đối so với thư mục làm việc của script.
Tôi có nên dùng pathlib không?
Có, để xử lý đường dẫn sạch sẽ, đa nền tảng.
Ở một thời điểm nào đó, mọi chương trình Python đều cần lưu thứ gì đó: nhật ký, kết quả, đầu vào của người dùng, tệp cấu hình hoặc dữ liệu đã xử lý. Bạn có thể đang xuất kết quả phân tích, ghi lại những gì script đã làm hoặc duy trì trạng thái ứng dụng giữa các lần chạy. Dù là trường hợp nào, ghi vào tệp là một kỹ năng cốt lõi của Python mà bạn sẽ dùng lặp đi lặp lại.
Trong hướng dẫn này, bạn sẽ học cách ghi vào tệp trong Python bằng thư viện chuẩn. Chúng ta sẽ bắt đầu với những điều cơ bản, sau đó đi qua các chế độ tệp, mã hóa, các định dạng có cấu trúc như JSON và CSV, và những mẫu sẵn sàng cho môi trường sản xuất giúp mã của bạn an toàn và dễ dự đoán hơn. Kết thúc bài, bạn sẽ có thể ghi tệp một cách tự tin trong các ứng dụng thực tế chứ không chỉ các ví dụ thử nghiệm.
Nếu bạn đã thoải mái với các kiến thức cơ bản của Python, bài hướng dẫn này sẽ giúp lấp đầy khoảng trống giữa script và xử lý tệp ở cấp độ chuyên nghiệp. Nếu muốn củng cố nền tảng trong khi bạn học, các khóa Introduction to Python và Intermediate Python phối hợp rất tốt với phần này.