Đọc và Ghi File
1. Giới thiệu
Phần tiêu đề “1. Giới thiệu”Làm việc với file là một kỹ năng quan trọng trong lập trình. Python cung cấp các hàm đơn giản để:
- Đọc dữ liệu từ file
- Ghi dữ liệu vào file
- Thêm dữ liệu vào cuối file
- Làm việc với nhiều loại file khác nhau
2. Mở File
Phần tiêu đề “2. Mở File”2.1 - Hàm open()
Phần tiêu đề “2.1 - Hàm open()”file = open("filename.txt", "mode")2.2 - Các chế độ (mode) phổ biến
Phần tiêu đề “2.2 - Các chế độ (mode) phổ biến”| Mode | Ý nghĩa | Mô tả |
|---|---|---|
"r" |
Read (đọc) | Mở để đọc (mặc định) |
"w" |
Write (ghi) | Mở để ghi, xoá nội dung cũ |
"a" |
Append (thêm) | Mở để thêm vào cuối |
"r+" |
Read + Write | Đọc và ghi |
"rb" |
Read Binary | Đọc file nhị phân |
"wb" |
Write Binary | Ghi file nhị phân |
2.3 - Ví dụ mở file
Phần tiêu đề “2.3 - Ví dụ mở file”# Mở file để đọcfile = open("data.txt", "r")
# Mở file để ghifile = open("output.txt", "w")
# Mở file để thêmfile = open("log.txt", "a")3. Đọc File
Phần tiêu đề “3. Đọc File”3.1 - read() - Đọc toàn bộ file
Phần tiêu đề “3.1 - read() - Đọc toàn bộ file”file = open("data.txt", "r")content = file.read()print(content)file.close()3.2 - readline() - Đọc từng dòng
Phần tiêu đề “3.2 - readline() - Đọc từng dòng”file = open("data.txt", "r")line1 = file.readline()line2 = file.readline()print(line1)print(line2)file.close()3.3 - readlines() - Đọc tất cả dòng thành list
Phần tiêu đề “3.3 - readlines() - Đọc tất cả dòng thành list”file = open("data.txt", "r")lines = file.readlines()for line in lines: print(line.strip()) # strip() để xoá \nfile.close()3.4 - Đọc file với vòng lặp
Phần tiêu đề “3.4 - Đọc file với vòng lặp”file = open("data.txt", "r")for line in file: print(line.strip())file.close()4. Ghi File
Phần tiêu đề “4. Ghi File”4.1 - write() - Ghi chuỗi
Phần tiêu đề “4.1 - write() - Ghi chuỗi”file = open("output.txt", "w")file.write("Hello World\n")file.write("Python Programming\n")file.close()Lưu ý: Mode "w" sẽ xoá toàn bộ nội dung cũ!
4.2 - writelines() - Ghi list
Phần tiêu đề “4.2 - writelines() - Ghi list”lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
file = open("output.txt", "w")file.writelines(lines)file.close()4.3 - Thêm vào cuối file (append)
Phần tiêu đề “4.3 - Thêm vào cuối file (append)”file = open("log.txt", "a")file.write("New log entry\n")file.close()5. Đóng File
Phần tiêu đề “5. Đóng File”Quan trọng: Luôn đóng file sau khi sử dụng!
file = open("data.txt", "r")content = file.read()file.close() # Phải đóng file!6. Context Manager (with statement)
Phần tiêu đề “6. Context Manager (with statement)”Cách TỐT NHẤT để làm việc với file - tự động đóng file:
6.1 - Cú pháp
Phần tiêu đề “6.1 - Cú pháp”with open("filename.txt", "mode") as file: # Làm việc với file pass# File tự động đóng khi ra khỏi khối with6.2 - Ví dụ đọc file
Phần tiêu đề “6.2 - Ví dụ đọc file”with open("data.txt", "r") as file: content = file.read() print(content)# File đã tự động đóng6.3 - Ví dụ ghi file
Phần tiêu đề “6.3 - Ví dụ ghi file”with open("output.txt", "w") as file: file.write("Hello World\n") file.write("Python is awesome!\n")6.4 - Ví dụ xử lý lỗi
Phần tiêu đề “6.4 - Ví dụ xử lý lỗi”try: with open("data.txt", "r") as file: content = file.read() print(content)except FileNotFoundError: print("File không tồn tại!")except PermissionError: print("Không có quyền đọc file!")7. Kiểm tra File tồn tại
Phần tiêu đề “7. Kiểm tra File tồn tại”7.1 - Sử dụng os.path
Phần tiêu đề “7.1 - Sử dụng os.path”import os
if os.path.exists("data.txt"): print("File tồn tại")else: print("File không tồn tại")
# Kiểm tra là file hay folderif os.path.isfile("data.txt"): print("Đây là file")
if os.path.isdir("folder"): print("Đây là folder")7.2 - Sử dụng Path (pathlib)
Phần tiêu đề “7.2 - Sử dụng Path (pathlib)”from pathlib import Path
file_path = Path("data.txt")
if file_path.exists(): print("File tồn tại")
if file_path.is_file(): print("Đây là file")8. Làm việc với đường dẫn
Phần tiêu đề “8. Làm việc với đường dẫn”8.1 - Lấy thông tin file
Phần tiêu đề “8.1 - Lấy thông tin file”import os
# Lấy kích thước file (bytes)size = os.path.getsize("data.txt")print(f"Kích thước: {size} bytes")
# Lấy thời gian sửa đổiimport timemtime = os.path.getmtime("data.txt")print(f"Sửa đổi lần cuối: {time.ctime(mtime)}")8.2 - Đường dẫn tương đối và tuyệt đối
Phần tiêu đề “8.2 - Đường dẫn tương đối và tuyệt đối”import os
# Đường dẫn hiện tạicurrent_dir = os.getcwd()print(f"Thư mục hiện tại: {current_dir}")
# Đường dẫn tuyệt đốiabs_path = os.path.abspath("data.txt")print(f"Đường dẫn tuyệt đối: {abs_path}")
# Nối đường dẫnpath = os.path.join("folder", "subfolder", "file.txt")8.3 - Tạo và xoá file/folder
Phần tiêu đề “8.3 - Tạo và xoá file/folder”import os
# Tạo folderos.mkdir("new_folder")
# Tạo folder lồng nhauos.makedirs("parent/child/grandchild")
# Xoá fileos.remove("file.txt")
# Xoá folder rỗngos.rmdir("folder")
# Đổi tên fileos.rename("old_name.txt", "new_name.txt")9. Đọc ghi file Text
Phần tiêu đề “9. Đọc ghi file Text”Ví dụ 1: Đọc và in file
Phần tiêu đề “Ví dụ 1: Đọc và in file”def read_and_print(filename): try: with open(filename, "r", encoding="utf-8") as file: content = file.read() print(content) except FileNotFoundError: print(f"File '{filename}' không tồn tại")
read_and_print("data.txt")Ví dụ 2: Copy file
Phần tiêu đề “Ví dụ 2: Copy file”def copy_file(source, destination): with open(source, "r") as src: with open(destination, "w") as dst: dst.write(src.read()) print(f"Đã copy {source} -> {destination}")
copy_file("input.txt", "output.txt")Ví dụ 3: Đếm số dòng
Phần tiêu đề “Ví dụ 3: Đếm số dòng”def count_lines(filename): with open(filename, "r") as file: lines = file.readlines() return len(lines)
count = count_lines("data.txt")print(f"Số dòng: {count}")Ví dụ 4: Đếm từ
Phần tiêu đề “Ví dụ 4: Đếm từ”def count_words(filename): with open(filename, "r") as file: content = file.read() words = content.split() return len(words)
count = count_words("data.txt")print(f"Số từ: {count}")Ví dụ 5: Tìm kiếm trong file
Phần tiêu đề “Ví dụ 5: Tìm kiếm trong file”def search_in_file(filename, search_text): with open(filename, "r") as file: for line_num, line in enumerate(file, 1): if search_text in line: print(f"Dòng {line_num}: {line.strip()}")
search_in_file("data.txt", "Python")10. Làm việc với File Binary
Phần tiêu đề “10. Làm việc với File Binary”10.1 - Đọc file binary
Phần tiêu đề “10.1 - Đọc file binary”with open("image.png", "rb") as file: data = file.read() print(f"Kích thước: {len(data)} bytes")10.2 - Copy file binary
Phần tiêu đề “10.2 - Copy file binary”def copy_binary_file(source, destination): with open(source, "rb") as src: with open(destination, "wb") as dst: dst.write(src.read())
copy_binary_file("image.png", "image_copy.png")11. File với encoding
Phần tiêu đề “11. File với encoding”Quan trọng khi làm việc với Tiếng Việt:
# Đọc file với UTF-8with open("vietnamese.txt", "r", encoding="utf-8") as file: content = file.read() print(content)
# Ghi file với UTF-8with open("output.txt", "w", encoding="utf-8") as file: file.write("Xin chào Việt Nam\n") file.write("Python là ngôn ngữ tuyệt vời\n")12. Ví dụ thực tế
Phần tiêu đề “12. Ví dụ thực tế”Ví dụ 1: Ghi log
Phần tiêu đề “Ví dụ 1: Ghi log”from datetime import datetime
def write_log(message): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open("app.log", "a", encoding="utf-8") as file: file.write(f"[{timestamp}] {message}\n")
write_log("Application started")write_log("User logged in")write_log("Error occurred")Ví dụ 2: Lưu cấu hình
Phần tiêu đề “Ví dụ 2: Lưu cấu hình”def save_config(config): with open("config.txt", "w") as file: for key, value in config.items(): file.write(f"{key}={value}\n")
def load_config(): config = {} with open("config.txt", "r") as file: for line in file: key, value = line.strip().split("=") config[key] = value return config
# Sử dụngconfig = {"username": "admin", "theme": "dark", "language": "vi"}save_config(config)
loaded = load_config()print(loaded)Ví dụ 3: To-Do List
Phần tiêu đề “Ví dụ 3: To-Do List”def add_task(task): with open("todo.txt", "a", encoding="utf-8") as file: file.write(f"[ ] {task}\n")
def show_tasks(): try: with open("todo.txt", "r", encoding="utf-8") as file: print("=== TO-DO LIST ===") for i, task in enumerate(file, 1): print(f"{i}. {task.strip()}") except FileNotFoundError: print("Chưa có task nào")
# Sử dụngadd_task("Học Python")add_task("Làm bài tập")show_tasks()Ví dụ 4: Thống kê file
Phần tiêu đề “Ví dụ 4: Thống kê file”def file_statistics(filename): with open(filename, "r", encoding="utf-8") as file: content = file.read() lines = content.split("\n") words = content.split()
stats = { "lines": len(lines), "words": len(words), "characters": len(content), "characters_no_spaces": len(content.replace(" ", "")) } return stats
stats = file_statistics("data.txt")print(f"Số dòng: {stats['lines']}")print(f"Số từ: {stats['words']}")print(f"Số ký tự: {stats['characters']}")Ví dụ 5: Backup file
Phần tiêu đề “Ví dụ 5: Backup file”import shutilfrom datetime import datetime
def backup_file(filename): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") backup_name = f"{filename}.backup_{timestamp}" shutil.copy2(filename, backup_name) print(f"Backup created: {backup_name}")
backup_file("important_data.txt")13. Best Practices
Phần tiêu đề “13. Best Practices”1. Luôn dùng with statement
Phần tiêu đề “1. Luôn dùng with statement”# TỐTwith open("file.txt", "r") as file: content = file.read()
# TRÁNHfile = open("file.txt", "r")content = file.read()file.close() # Dễ quên!2. Xử lý exceptions
Phần tiêu đề “2. Xử lý exceptions”# TỐTtry: with open("file.txt", "r") as file: content = file.read()except FileNotFoundError: print("File không tồn tại")except PermissionError: print("Không có quyền truy cập")3. Chỉ định encoding
Phần tiêu đề “3. Chỉ định encoding”# TỐT - Rõ ràngwith open("file.txt", "r", encoding="utf-8") as file: content = file.read()
# TRÁNH - Dùng encoding mặc định (có thể khác nhau trên các hệ điều hành)with open("file.txt", "r") as file: content = file.read()4. Đọc file lớn từng dòng
Phần tiêu đề “4. Đọc file lớn từng dòng”# TỐT - Tiết kiệm bộ nhớwith open("large_file.txt", "r") as file: for line in file: process(line)
# TRÁNH - Load toàn bộ vào RAMwith open("large_file.txt", "r") as file: content = file.read() # Nguy hiểm với file lớn!5. Sử dụng pathlib
Phần tiêu đề “5. Sử dụng pathlib”from pathlib import Path
# TỐT - Modern, cross-platformpath = Path("folder") / "subfolder" / "file.txt"content = path.read_text(encoding="utf-8")
# Tương đương nhưng cũ hơnimport ospath = os.path.join("folder", "subfolder", "file.txt")with open(path, "r", encoding="utf-8") as file: content = file.read()Bài giảng trên YouTube
Phần tiêu đề “Bài giảng trên YouTube”Cập nhật sau
📝 Bài tập thực hành
Phần tiêu đề “📝 Bài tập thực hành”Sau khi học xong bài này, hãy thực hành với các bài tập sau: