2.27. Đọc và ghi¶
Các file lưu trên đĩa; Python truy cập chúng qua open(), hàm này trả về một đối tượng file có các phương thức đọc và ghi các byte bên dưới.
2.27.1. open và các chế độ¶
Đối số đầu tiên là đường dẫn; đối số thứ hai là chế độ -- một chuỗi ngắn cho Python biết file sẽ được sử dụng như thế nào:
"r"-- đọc (mặc định). Mở một file hiện có để đọc."w"-- ghi. Tạo một file mới hoặc cắt bỏ một file hiện có thành rỗng."a"-- nối thêm. Mở một file để ghi ở cuối mà không cắt bỏ."b"được thêm vào bất kỳ chế độ nào ở trên ("rb","wb","ab") -- chế độ nhị phân. Nội dung file làbytesthay vìstr.
f = open("notes.txt", "r")
text = f.read()
f.close()
2.27.2. Dùng context manager¶
Mẫu trên bị rò rỉ file handle nếu có bất kỳ thứ gì giữa open() và close ném ra. Cách sửa là dùng câu lệnh with (xem context managers):
with open("notes.txt") as f:
text = f.read()
# f is closed here, even if read() failed
Đây là dạng chuẩn -- hãy viết theo cách này mỗi lần.
2.27.3. Đọc¶
Các đối tượng file hỗ trợ nhiều cách đọc:
io.IOBase.read()-- đọc toàn bộ file (hoặc N byte) và trả về dưới dạng một chuỗi đơn (hoặc đối tượng bytes).io.IOBase.readline()-- đọc một dòng, bao gồm cả ký tự xuống dòng"\n"ở cuối.Duyệt file trực tiếp trả về từng dòng một lần, với mức sử dụng bộ nhớ nhỏ hơn nhiều so với đọc toàn bộ file cùng lúc.
with open("log.txt") as f:
for line in f:
print(line.rstrip())
str.rstrip() loại bỏ ký tự xuống dòng ở cuối trước khi in để đầu ra không bị cách đôi.
2.27.4. Ghi¶
Mở file ở chế độ "w" và dùng io.IOBase.write():
with open("out.txt", "w") as f:
f.write("hello\n")
f.write("world\n")
io.IOBase.write() không thêm ký tự xuống dòng -- nó ghi chính xác các byte (hoặc ký tự, ở chế độ văn bản) mà bạn truyền vào.
2.27.5. Văn bản so với nhị phân¶
Chế độ văn bản (mặc định, "r" / "w" không có "b") giải mã các byte đến thành str bằng mã hóa mặc định, và mã hóa str đi ra trở lại thành byte. Dùng cho cấu hình, log, JSON -- bất cứ thứ gì là văn bản.
Chế độ nhị phân ("rb" / "wb") bỏ qua bước giải mã và trả về bytes. Dùng cho ảnh, bản ghi đóng gói struct, các bắt nắm mạng -- bất cứ thứ gì mà mỗi byte đều quan trọng và file không thể đọc được bằng người.
2.27.6. Liệt kê và xóa file¶
Module os cung cấp các thao tác filesystem không có trên đối tượng file:
os.listdir()-- trả về danh sách tên trong một thư mục.os.remove()-- xóa một file.os.rename()-- đổi tên một file.os.stat()-- siêu dữ liệu file (kích thước, thời gian sửa đổi, ...).os.mkdir()-- tạo một thư mục mới.
import os
for name in os.listdir("/"):
print(name)
Bắt OSError xung quanh các lời gọi này khi file hoặc thư mục có thể không tồn tại -- thao tác này là một trong những nơi phổ biến xuất hiện ngoại lệ trong các tập lệnh thực tế.