Nếu bạn có một tệp lớn mà bạn không muốn lưu trữ trong bộ nhớ hoặc lặp lại theo cách bạn đã thấy trước đây, bạn có thể dựa vào việc tìm kiếm tệp
Để tìm dòng cuối cùng của một tệp lớn trong Python bằng cách tìm kiếm
- Mở tệp ở chế độ nhị phân
- Tìm kiếm đến cuối tập tin
- Quay lại các ký tự để tìm đầu dòng cuối cùng
Đây là giao diện của nó trong mã
import os with open("example.txt", "rb") as file: try: file.seek(-2, os.SEEK_END) while file.read(1) != b'\n': file.seek(-2, os.SEEK_CUR) except OSError: file.seek(0) last_line = file.readline().decode()Tuy nhiên, bằng cách xem mã, việc hiểu cách thức hoạt động của nó không phải là chuyện nhỏ
Tìm kiếm tệp hoạt động như thế nào trong Python
Để đọc dòng cuối cùng của tệp bằng cách tìm kiếm trong Python, trình đọc tệp được di chuyển đến ký tự cuối cùng của tệp. Sau đó, đầu đọc nhảy ngược từng ký tự cho đến khi đến đầu dòng cuối cùng. Sau đó, nó đọc dòng cuối cùng vào bộ nhớDưới đây là minh họa về cách mã tìm thấy dòng cuối cùng trong một tệp có ba dòng văn bản
Hãy xem mã chi tiết hơn một chút
Trước hết, tìm kiếm có nghĩa là đặt vị trí của trình đọc tệp trong tệp
Trong Python, bạn chỉ có thể tìm kiếm tệp nhị phân, vì vậy bạn cần đọc tệp dưới dạng tệp nhị phân
Phương thức seek() tuân theo cú pháp này
file.seek(offset, whence)Ở đâu
Độ lệch chỉ định số lượng ký tự cần di chuyển. Sử dụng giá trị âm để di chuyển lùi
Đối số wherece là đối số tùy chọn có thể được đặt
- hệ điều hành. SEEK_SET hoặc 0—tìm kiếm liên quan đến phần đầu của tệp
- hệ điều hành. SEEK_CUR hoặc 1—tìm kiếm liên quan đến vị trí hiện tại trong tệp
- hệ điều hành. SEEK_END hoặc 2—tìm kiếm liên quan đến phần cuối của tệp
Trước hết, hãy đơn giản hóa đoạn mã trên một chút bằng cách loại bỏ phần xử lý lỗi và các hằng số mô-đun os
with open("example.txt", "rb") as file: file.seek(-2, 2) while file.read(1) != b'\n': file.seek(-2, 1) last_line = file.readline().decode()Bây giờ bạn đã hiểu phương thức seek() hoạt động như thế nào, bạn có thể hiểu mã
- tập tin. seek(-2, 2) có nghĩa là “Chuyển đến ký tự thứ 2 trước khi kết thúc tệp”
- tập tin. read(1) có nghĩa là “Đọc ký tự từ bên phải”
- tập tin. seek(-2, 1) có nghĩa là “Nhảy 2 ký tự còn lại từ ký tự hiện tại”
- b’\n’ là ký tự ngắt dòng ở chế độ nhị phân
- tập tin. dòng đọc (). decode() đọc dòng và chuyển đổi nó từ nhị phân thành chuỗi
Vì vậy, quá trình là như sau
- Trước tiên, mã nhảy đến ký tự cuối cùng của tệp
- Sau đó, nó sẽ kiểm tra xem ký tự có phải là ký tự ngắt dòng không
- Nếu không, nó sẽ quay lại một ký tự và kiểm tra lại
- Nó lặp lại điều này cho đến khi gặp phải ngắt dòng, điều này cho thấy rằng đã đến đầu dòng cuối cùng
- Sau đó, nó lưu dòng cuối cùng trong bộ nhớ
Lưu ý rằng việc tìm kiếm tệp chỉ hoạt động với tệp nhị phân. Đây là lý do tại sao tệp được đọc ở chế độ nhị phân. Ngoài ra, lưu ý rằng khi bạn đang xử lý tệp nhị phân, bạn cần nhảy hai ký tự sang trái để đọc một ký tự ở bên phải
Bây giờ, hãy quay lại xử lý lỗi bắt thử để đảm bảo tệp không dài chính xác một dòng. Bởi vì nếu có, hàm seek() sẽ không bao giờ gặp ký tự ngắt dòng vì không có ký tự nào. Hãy cũng sử dụng các hằng số của mô-đun os SEEK_END và SEEK_CUR thay vì 1 hoặc 2 đơn giản
Hướng dẫn này sẽ chỉ cho bạn cách đọc n dòng cuối cùng từ tệp bằng ngôn ngữ lập trình Python. N dòng cuối cùng có nghĩa là, 5 dòng cuối cùng hoặc 10 dòng cuối cùng, v.v. Vì vậy, n có thể được thay thế bằng bất kỳ giá trị nguyên dương nào
Nói chung, bạn đọc tệp từ đầu nhưng đôi khi vì yêu cầu kinh doanh của bạn, bạn có thể cần đọc tệp từ cuối. Vì vậy, bạn có thể cần đọc tệp từ đầu bằng bất kỳ công nghệ nào. Ở đây tôi sẽ chỉ cho bạn cách đọc n dòng cuối cùng từ tệp bằng Python
Bạn cũng có thể đọc hướng dẫn tương tự về cách đọc n dòng cuối bằng Java và PHP
điều kiện tiên quyết
Trăn 3. 8. 5
Đọc n dòng cuối cùng
Tôi đã định nghĩa một hàm gọi là tail() nhận ba đối số – tên tệp, số dòng để đọc từ cuối và kích thước khối theo byte
Đối số đầu tiên, tên tệp, là bắt buộc và hai đối số khác là tùy chọn vì tôi đã cung cấp các giá trị mặc định cho chúng
def tail(file, n=1, bs=1024): f = open(file) f.seek(0,2) l = 1-f.read(1).count('\n') B = f.tell() while n >= l and B > 0: block = min(bs, B) B -= block f.seek(B, 0) l += f.read(block).count('\n') f.seek(B, 0) l = min(l,n) lines = f.readlines()[-l:] f.close() return linesTrong hàm tail() ở trên, chúng tôi sử dụng hàm seek() tích hợp sẵn của Python có các tính năng sau
seek() đặt vị trí hiện tại của tệp ở phần bù. Đối số wherece là tùy chọn và mặc định là 0, có nghĩa là vị trí tệp tuyệt đối, các giá trị khác là 1 có nghĩa là tìm kiếm liên quan đến vị trí hiện tại và file.seek(offset, whence)0 có nghĩa là tìm kiếm liên quan đến phần cuối của tệp. không có giá trị quay lại