23. Thao tác với tập tin văn bản
Ở các bài học trước, khi bạn chạy một chương trình và nhập dữ liệu (như họ tên, điểm số), dữ liệu đó chỉ tồn tại tạm thời trên bộ nhớ (RAM). Khi bạn tắt chương trình, mọi dữ liệu sẽ biến mất. Để lưu giữ dữ liệu lâu dài, chúng ta cần ghi chúng vào các tập tin (file) trên ổ cứng.
23.1 Các thao tác với tập tin
Thao tác với tập tin giống như việc bạn sử dụng một cuốn sổ tay để ghi chép. Để sử dụng, bạn cần thực hiện 3 bước cơ bản:
- [1] Mở sổ tay (open): Mở tập tin để sẵn sàng đọc hoặc ghi
- [2] Sử dụng sổ tay (read/write): Đọc thông tin từ sổ tay hoặc viết thông tin mới vào
- [3] Đóng sổ tay (close): Cất sổ tay đi để bảo đảm thông tin không bị mất
Chúng ta sẽ thực hành trên 2 kiểu tập tin văn bản là .txt và .csv.
23.2 Thao tác với tập tin .txt
Bạn hãy thực hiện các bước sau, để trải nghiệm việc thao tác với tập tin:
- Tạo một tập tin có tên chao_mung.txt. Viết dòng chữ “Chào mừng bạn đến với khóa học Python!” vào tập tin chao_mung.txt. Lưu ý: tập tin chao_mung.txt phải nằm cùng thư mục với tập tin mã nguồn TapTin.py
- Viết đoạn mã Python sau vào tập tin TapTin.py
[TapTin.py]
# Bước 1: Mở tập tin
f = open("chao_mung.txt", "r", encoding="utf-8")
# Bước 2: Đọc nội dung và in ra màn hình
noi_dung = f.read()
print(noi_dung)
# Bước 3: Đóng tập tin
f.close()
Ở đoạn mã trên, bạn đã:
- Sử dụng hàm open() để mở một tập tin có sẵn (chao_mung.txt
- Sử dụng tham số “r” (read) để đọc nội dung tập tin
- Sử dụng bảng mã encoding="utf-8" giúp máy tính đọc được các chữ có dấu tiếng Việt
- Sử dụng biến f để tham chiếu tới tập tin, và thực hiện các thao tác khác trên tập tin
- Sử dụng hàm read() để đọc toàn bộ nội dung tập tin
- Sử dụng hàm close() để đóng tập tin
Ghi nội dung vào tập tin
Để ghi dữ liệu, chúng ta có hai chế độ chính:
- "w" (Write): Xóa hết nội dung cũ và ghi mới hoàn toàn
- "a" (Append): Ghi thêm nội dung vào cuối tập tin cũ
Ví dụ minh họa:
[GhiTapTin.py]
# Ghi mới vào tập tin
f = open("nhat_ky.txt", "w", encoding="utf-8")
f.write("Hôm nay tôi bắt đầu học về tập tin trong Python.\n")
f.write("Lập trình thật thú vị!")
f.close()
Khi chạy đoạn mã trên, nếu chưa có sẵn tập tin nhat_ky.txt, Python sẽ tạo mới tập tin và ghi nội dung vào tập tin vừa tạo. Python sử dụng tham số “w” (write, viết) trong hàm open() để báo là mở tập tin để ghi nội dung; sử dụng hàm write() để ghi nội dung vào tập tin.
Ghi thêm nội dung vào cuối tập tin cũ
Kiểu ghi nội dung này rất hữu ích khi bạn muốn ghi nhật ký (log) hoặc ghi thêm dữ liệu mới mà không làm mất đi những gì đã có sẵn trong tập tin. Sử dụng tham số “a” khi mở tập tin (a là viết tắt của append - gắn vào cuối).
Ví dụ:
Giả sử bạn đã có một tập tin tên là nhat_ky.txt với nội dung cũ. Bây giờ chúng ta sẽ ghi thêm một dòng mới vào cuối tập tin đó.
[GhiVaoCuoi.py]
# Bước 1: Mở tập tin ở chế độ "a" (Append)
# encoding="utf-8" giúp ghi được tiếng Việt có dấu
file = open("nhat_ky.txt", "a", encoding="utf-8")
# Bước 2: Ghi thêm nội dung mới
# Sử dụng ký tự \n để dòng mới được xuống hàng, không bị dính liền với dòng cũ
file.write("\n10:00 AM - Đã hoàn thành bài tập Python về tập tin.")
# Bước 3: Đóng tập tin
file.close()
print("Đã ghi thêm nội dung thành công!")
Giải thích đoạn mã trên:
open("nhat_ky.txt", "a"):
- Nếu tập tin nhat_ky.txt đã tồn tại: Python sẽ đặt "con trỏ" ở cuối tập tin (tạm hiểu con trỏ là dấu nháy khi soạn thảo văn bản). Mọi nội dung bạn ghi sau đó sẽ nối tiếp vào đuôi
- Nếu tập tin nhat_ky.txt chưa tồn tại: Python sẽ tự động tạo một tập tin mới hoàn toàn
- \n: Đây là ký tự xuống dòng. Nếu bạn không thêm \n, nội dung mới sẽ nằm ngay sát sau ký tự cuối cùng của nội dung cũ
- Sự khác biệt của tham số "a" với "w": Nếu bạn dùng "w", toàn bộ nội dung cũ trong nhat_ky.txt sẽ bị xóa sạch trước khi ghi mới. Với "a", nội dung cũ được giữ nguyên.
Cách viết an toàn hơn (Khuyên dùng)
Trong thực tế, các lập trình viên kinh nghiệm thường dùng từ khóa with để tránh việc quên đóng tập tin (close()):
Ví dụ:
with open("nhat_ky.txt", "a", encoding="utf-8") as file:
file.write("\n11:30 AM - Chuẩn bị nghỉ trưa.")
# Khi dùng 'with', file sẽ tự động đóng sau khi chạy hết khối lệnh bên trong.
Xóa tập tin
Trong lập trình, việc xóa các tập tin không còn sử dụng (như tập tin tạm, tập tin lịch sử cũ) là rất quan trọng để tiết kiệm không gian đĩa cứng. Để xóa tập tin trong Python, chúng ta cần dùng đến thư viện có sẵn tên là os (viết tắt của Operating System - Hệ điều hành).
Để xóa một tập tin, chúng ta sử dụng hàm os.remove().
Lưu ý: Khi bạn dùng lệnh xóa tập tin trong lập trình, tập tin sẽ bị xóa vĩnh viễn và không nằm trong "Thùng rác" (Recycle Bin) của máy tính. Vì vậy, bạn hãy cẩn thận.
Ví dụ:
Tạo sẵn một tập tin để xóa, ví dụ: FileTam.txt
import os # Bước 1: Phải nạp thư viện os
# Bước 2: Gọi lệnh xóa
os.remove("FileTam.txt")
print("Đã xóa tập tin thành công!")
Cách xóa tập tin an toàn (Kiểm tra trước khi xóa)
Nếu bạn ra lệnh xóa một tập tin không tồn tại, chương trình sẽ bị "treo" và báo lỗi ngay lập tức. Một lập trình viên kinh nghiệm sẽ luôn kiểm tra xem tập tin đó có thực sự tồn tại hay không trước khi xóa.
Ví dụ:
import os
ten_file = "lich_su_cu.txt"
# Kiểm tra xem file có tồn tại trên ổ cứng không
if os.path.exists(ten_file):
os.remove(ten_file)
print(f"Đã xóa xong tập tin: {ten_file}")
else:
print("Thông báo: Tập tin này không tồn tại nên không thể xóa.")
23.3 Thao tác với tập tin .csv
Tập tin CSV (Comma Separated Values) là loại tập tin mà các giá trị được ngăn cách bởi dấu phẩy. Nó trông giống như một bảng tính Excel đơn giản.
Ví dụ: ghi danh sách học sinh và điểm vào tập tin CSV:
import csv # Nạp thư viện hỗ trợ tập tin CSV
danh_sach = [
["Tên", "Điểm"],
["Tèo", 9],
["Bình", 10]
]
with open("diem_so.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(danh_sach)
# Dùng 'with' giúp tự động đóng tập tin, bạn không cần gọi f.close()
Giải thích đoạn mã trên:
- Đoạn mã trên sẽ tạo ra một bảng điểm và lưu nó vào một tập tin có thể mở được bằng Excel, nhờ vào đuôi của tập tin là .csv.
import csv
- Gọi thư viện của Python (csv), để dùng các hàm có sẵn khi làm việc với tập tin .csv
danh_sach = [
["Tên", "Điểm"],
["Tèo", 9],
["Bình", 10]
]
- Tạo danh sách lồng nhau (List of Lists). Mỗi danh sách con bên trong (như ["Tèo", 9]) đại diện cho một hàng trong bảng. Các phần tử trong danh sách con đại diện cho các cột (cột Tên và cột Điểm)
with open(...) as f:
- "diem_so.csv": Tên tập tin bạn muốn tạo ra
- "w" (Write): Chế độ ghi. Nếu tập tin đã có, nó sẽ xóa sạch để ghi mới. Nếu chưa có, nó sẽ tạo tập tin mới
- newline="": Một tham số để đảm bảo khi ghi tập tin trên các hệ điều hành khác nhau (Windows, Mac) sẽ không bị xuất hiện các dòng trống thừa
- encoding="utf-8": để làm việc với chữ có dấu tiếng Việt
- with...as f: Đây là cách viết thông minh. Nó mở tập tin ra và đặt tên tạm gọi là f. Khi chạy xong các lệnh thụt lề bên trong, Python sẽ tự động đóng tập tin lại cho bạn, giúp an toàn dữ liệu
writer = csv.writer(f)
- Tạo ra một "thợ viết" (đối tượng writer). Thợ viết này biết cách cầm "bút" f để ghi dữ liệu theo đúng định dạng CSV (ngăn cách nhau bằng dấu phẩy)
writer.writerows(danh_sach)
- Lệnh này yêu cầu "thợ viết" lấy toàn bộ các hàng trong danh_sach và chép vào tập tin. Kết quả là bạn sẽ có một bảng dữ liệu ngăn nắp
Sau khi chạy đoạn mã trên, vào thư mục chứa tập tin mã nguồn, bạn sẽ thấy một tập tin mới tên là diem_so.csv. Khi mở bằng Notepad, nó sẽ trông như thế này:
Tên,Điểm
Tèo,9
Bình,10
Nhưng khi mở bằng Excel hoặc Google Sheets, nó sẽ hiện ra thành một bảng tính với cột Tên và cột Điểm rõ ràng.
23.4 Bài tập và câu hỏi
Bài tập
Bài tập 23a: Viết chương trình máy tính thực hiện liên tục các phép tính: cộng, trừ, nhân, chia, và số mũ hai số. Sau khi tính xong, hãy ghi các phép tính đó vào tập tin lich_su.txt.
Ví dụ: Nếu nhập 5 + 3, tập tin sẽ ghi: 5 + 3 = 8
Bài tập 23b: Nâng cấp máy tính ở bài 23a. Khi bắt đầu chạy chương trình, máy tính sẽ đọc tập tin lich_su.txt và hiển thị lại một phép tính gần nhất đã thực hiện trước đó.
Bài tập 23c: Tạo một tập tin cai_dat.csv lưu cấu hình máy tính gồm: TenMayTinh, MauSac. Viết chương trình cho phép người dùng thay đổi tên máy tính và màu sắc hiển thị, sau đó lưu lại vào file CSV này để lần sau mở lên máy tính vẫn nhớ tên đó.
Câu hỏi ôn tập
Câu hỏi 23.1: Để mở một tập tin chỉ để đọc thông tin, bạn sử dụng chế độ nào trong hàm open()?
A. "w"
B. "a"
C. "r"
D. "x"
Câu hỏi 23.2: Tại sao chúng ta nên sử dụng lệnh f.close() sau khi thao tác xong với tập tin?
A. Để giải phóng bộ nhớ và đảm bảo dữ liệu được lưu an toàn
B. Để chương trình chạy nhanh hơn
C. Để xóa nội dung tập tin
D. Không cần thiết phải đóng tập tin
Câu hỏi 23.3: Sự khác biệt chính giữa chế độ "w" và "a" khi ghi tập tin là gì?
A. "w" dùng cho tập tin văn bản, "a" dùng cho tập tin số
B. "w" xóa nội dung cũ để ghi mới, "a" ghi thêm vào cuối tập tin
C. "w" chỉ ghi được một dòng, "a" ghi được nhiều dòng
D. Không có sự khác biệt
23. File Handling in Python
In previous lessons, when you ran a program and entered data (such as names or scores), that data existed only temporarily in RAM. When the program closes, all that data is lost. To store data permanently, we must write it to files on the hard drive.
23.1 File Operations
Working with files is like using a physical notebook. There are 3 essential steps:
- [1] Open: Open the file to prepare it for reading or writing.
- [2] Process (Read/Write): Read information from the file or write new data into it.
- [3] Close: Close the file to ensure data is saved and resources are released.
We will practice with two common text file formats: .txt and .csv.
23.2 Working with .txt Files
Follow these steps to experience basic file handling:
- Create a file named welcome.txt in the same folder as your Python script
- Write the text: "Welcome to the Python course!" inside it
- Create a Python file named FileHandling.py and enter the following code
[FileHandling.py]
# Step 1: Open the file
f = open("welcome.txt", "r", encoding="utf-8")
# Step 2: Read content and print to console
content = f.read()
print(content)
# Step 3: Close the file
f.close()
Key terms in the code:
- open(): Function to open a file
- "r" (Read): The mode used to read file content
- encoding="utf-8": Ensures the computer correctly reads special characters (like Vietnamese accents)
- f: The file object (variable) used to reference and manipulate the file
- read(): Method to read the entire content of the file
- close(): Method to close the file
Writing Data to a File
There are two primary modes for writing data:
- "w" (Write): Overwrites the file. It deletes existing content and starts fresh
- "a" (Append): Adds new content to the end of the existing file
Example: Writing a new file [WriteFile.py]
# Writing to a file (Overwrite mode)
f = open("diary.txt", "w", encoding="utf-8")
f.write("Today I started learning about file handling in Python.\n")
f.write("Programming is fun!")
f.close()
If diary.txt does not exist, Python will automatically create it.
Example: Appending data Appending is useful for creating logs or adding data without losing previous records. Use the "a" mode (short for append).
[AppendFile.py]
# Step 1: Open file in "a" mode
file = open("diary.txt", "a", encoding="utf-8")
# Step 2: Append new content
# \n is the newline character so the text starts on a new line
file.write("\n10:00 AM - Completed the Python file exercise.")
# Step 3: Close the file
file.close()
print("Content appended successfully!")
Note: The difference between "a" and "w" is that "w" wipes the file clean before writing, while "a" keeps the old data and places the "cursor" at the end.
The Recommended Way: The with Statement
Professional developers use the with keyword. It is safer because it automatically closes the file even if an error occurs.
with open("diary.txt", "a", encoding="utf-8") as file:
file.write("\n11:30 AM - Preparing for lunch break.")
# No need for file.close() - it happens automatically!
Deleting Files
To delete files, we use the os (Operating System) module. Warning: Files deleted this way do not go to the Recycle Bin; they are permanently removed.
import os
filename = "temp_file.txt"
# Safe deletion: Check if the file exists first
if os.path.exists(filename):
os.remove(filename)
print(f"Deleted: {filename}")
else:
print("Error: File does not exist.")
23.3 Working with .csv Files
CSV (Comma Separated Values) files store data separated by commas, making them compatible with spreadsheet software like Excel.
Example: Saving a grade list
import csv
data = [
["Name", "Score"],
["Teo", 9],
["Binh", 10]
]
with open("grades.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(data)
Code Breakdown:
- import csv: Imports the library for CSV manipulation
- newline="": Prevents extra blank lines between rows on Windows
- csv.writer(f): Creates a "writer object" that formats your data correctly
- writerows(data): Writes multiple rows from a list of lists at once
23.4 Exercises and Review
Exercises
Task 23a: Create a calculator that performs +, -, *, /, and **. Log every calculation to history.txt (e.g., 5 + 3 = 8).
Task 23b: Upgrade the calculator. When the program starts, it should read history.txt and display the most recent calculation.
Task 23c: Create settings.csv to store ComputerName and Color. Allow the user to update these settings and save them so the program "remembers" them next time.
Review Questions
23.1 Which mode is used to open a file for reading only?
A. "w"
B. "a"
C. "r"
D. "x"
Question 23.2: Why should we use the f.close() command after finishing operations with a file?
A. To release memory and ensure data is saved safely
B. To make the program run faster
C. To delete the file's content
D. It is not necessary to close the file
Question 23.3: What is the primary difference between "w" and "a" modes when writing to a file?
A. "w" is used for text files, "a" is used for numeric files
B. "w" overwrites existing content, while "a" appends to the end of the file
C. "w" can only write one line, while "a" can write multiple lines
D. There is no difference