Chúng tôi đã tạo một chức năng để đọc N dòng cuối cùng từ tệp văn bản,
import os def get_last_n_lines[file_name, N]: # Create an empty list to keep the track of last N lines list_of_lines = [] # Open file for reading in binary mode with open[file_name, 'rb'] as read_obj: # Move the cursor to the end of the file read_obj.seek[0, os.SEEK_END] # Create a buffer to keep the last read line buffer = bytearray[] # Get the current position of pointer i.e eof pointer_location = read_obj.tell[] # Loop till pointer reaches the top of the file while pointer_location >= 0: # Move the file pointer to the location pointed by pointer_location read_obj.seek[pointer_location] # Shift pointer location by -1 pointer_location = pointer_location -1 # read that byte / character new_byte = read_obj.read[1] # If the read byte is new line character then it means one line is read if new_byte == b'\n': # Save the line in list of lines list_of_lines.append[buffer.decode[][::-1]] # If the size of list reaches N, then return the reversed list if len[list_of_lines] == N: return list[reversed[list_of_lines]] # Reinitialize the byte array to save next line buffer = bytearray[] else: # If last read character is not eol then add it in buffer buffer.extend[new_byte] # As file is read completely, if there is still data in buffer, then its first line. if len[buffer] > 0: list_of_lines.append[buffer.decode[][::-1]] # return the reversed list return list[reversed[list_of_lines]]
Hàm này chấp nhận 2 đối số i. e. đường dẫn tệp dưới dạng chuỗi và số nguyên N [số dòng được đọc từ cuối cùng]. Nó trả về một danh sách N dòng cuối cùng của tệp
Chức năng này hoạt động như thế nào?
Trước hết, nó tạo một danh sách trống để lưu trữ N dòng cuối cùng của tệp. Sau đó, nó mở tệp đã cho để đọc ở định dạng nhị phân và bắt đầu đọc từng byte từ cuối tệp cho đến khi bắt đầu tệp i. e. theo hướng ngược lại. Trong khi đọc byte, ngay khi nó gặp một ký tự dòng mới '\n', điều đó có nghĩa là một dòng đã được đọc thành công. Sau đó, nó đảo ngược chuỗi và thêm chuỗi/dòng đó vào danh sách và tiếp tục đọc các byte tiếp theo từ tệp theo hướng ngược lại cho đến khi đạt đến đầu tệp hoặc kích thước danh sách của chúng tôi trở thành N
Nó bên trong sử dụng hai chức năng tôi. e
- file_object. nói[]. Nó cung cấp vị trí hiện tại của con trỏ trong tệp, tôi. e. số byte từ đầu tệp
- file_object. tìm kiếm [bù, điểm tham chiếu]. Nó di chuyển con trỏ đến điểm tham chiếu + offset
Hãy sử dụng hàm đã tạo ở trên để tìm nạp N dòng cuối cùng từ một tệp văn bản,
Giả sử chúng ta có một tệp văn bản 'mẫu. txt' và nội dung của nó là,
Hello this is a sample file It contains sample text Dummy Line A Dummy Line B Dummy Line C This is the end of file
Bây giờ, chúng tôi sẽ tìm nạp N dòng cuối cùng từ tệp này,
Nhận 3 dòng cuối cùng của tệp văn bản dưới dạng danh sách trong python
# Get last three lines from file 'sample.txt' last_lines = get_last_n_lines["sample.txt", 3] print['Last 3 lines of File:'] # Iterate over the list of last 3 lines and print one by one for line in last_lines: print[line]
Đầu ra.
______3
Nó trả về 3 dòng cuối cùng từ tệp 'sample. txt’ dưới dạng danh sách các chuỗi và sau đó chúng tôi lặp lại danh sách để in 3 dòng cuối cùng của tệp.
Hãy xem một ví dụ khác,
Nhận 5 dòng cuối cùng của tệp văn bản hoặc tệp CSV
# get last five lines from the file last_lines = get_last_n_lines["sample.txt", 5] print['Last 5 lines of File:'] # Iterate over the list of last 5 lines and print one by one for line in last_lines: print[line]
Đầu ra.
______5
Hiệu quả của giải pháp.
Đây là một giải pháp hiệu quả vì chúng tôi chỉ đọc các dòng từ cuối cùng và tối đa chỉ có N dòng trong bộ nhớ tại một thời điểm
Vì vậy, ngay cả khi chúng tôi có tệp lớn với kích thước tính bằng GB và chúng tôi muốn đọc 10 dòng cuối cùng, thì giải pháp này sẽ cho kết quả hiệu quả vì chúng tôi đã bắt đầu từ cuối cùng và chỉ đọc cho đến 10 dòng cuối cùng, không quan trọng kích thước của tệp lớn như thế nào.
Đọc dòng cuối cùng của tệp văn bản hoặc tệp CSV hoặc tệp nhật ký
chúng ta có thể sử dụng chức năng tương tự, để đọc dòng cuối cùng của tệp. Chúng ta cần chuyển 1 làm đối số N trong hàm get_last_n_lines[] và nó sẽ trả về một danh sách chứa dòng cuối cùng. Ví dụ:
# get last line of the file last_lines = get_last_n_lines["sample.txt", 1] print['Last Line of File:'] print[last_lines[0]]
Đầu ra.
______7
Đây là cách chúng tôi đọc và in dòng cuối cùng từ một tệp. Đây cũng là một giải pháp hiệu quả ngay cả trong trường hợp tệp lớn vì chúng tôi bắt đầu đọc từ cuối và theo hướng ngược lại.