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