Làm thế nào để bạn đọc n dòng cuối cùng của tệp văn bản trong python?

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

  1. Mở tệp ở chế độ nhị phân
  2. Tìm kiếm đến cuối tập tin
  3. 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 lines

Trong 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

Làm thế nào bạn sẽ đọc n dòng cuối cùng của một tập tin?

Để xem vài dòng cuối cùng của tệp, hãy sử dụng lệnh tail . đuôi hoạt động giống như đầu. nhập đuôi và tên tệp để xem 10 dòng cuối cùng của tệp đó hoặc nhập tên tệp đuôi -number để xem các dòng số cuối cùng của tệp.

Python đại diện cho phần cuối của một dòng khi đọc tệp như thế nào?

Phương thức readlines() đọc tất cả các dòng trong một lần và lưu trữ từng dòng từ tệp văn bản dưới dạng một mục danh sách trong danh sách. Phương thức readlines() cũng thêm một ký tự xuống dòng \n ở cuối mỗi dòng.

Chủ đề