Thực hiện đơn giản lệnh đuôi trong Python
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều
'' ' | |
Thực hiện lệnh đuôi cơ bản | |
Usage: | |
Đuôi.py FileName Numlines | |
'' ' | |
Thực hiện lệnh đuôi cơ bản sys | |
Đuôi.py FileName Numlines linecache | |
Nhập khẩu len[sys.argv] !=3: | |
Nhập khẩu LineCache 'Usage: tail.py ' | |
iflen [sys.argv]! = 3:.exit[1] | |
Print'Usage: Tail.py ' | |
sys.exit [1], nlines = sys.argv[1:] | |
# Tên tệp và số dòng được yêu cầu = int[nlines] | |
fname, nlines = sys.argv [1:] | |
nlines = int [nlines] = len[open[fname].readlines[]] | |
# Đếm tổng số dòng | |
tot_lines = len [mở [fname] .ReadLines []] i in range[tot_lines - nlines + 1, tot_lines+1]: | |
# Sử dụng mô -đun bộ đệm dòng để đọc các dòng linecache.getline[sys.argv[1],i], |
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều
foriinrange [tot_lines-nlines+1, tot_lines+1]: | |
printlinecache.getline [sys.argv [1], i], | |
"" "Đây là phiên bản hiệu quả hơn, vì nó không đọc toàn bộ | |
Thực hiện lệnh đuôi cơ bản sys | |
Đuôi.py FileName Numlines os | |
bufsize=8192 = 8192 | |
Nhập khẩu = int[sys.argv[1]] | |
Nhập khẩu LineCache = sys.argv[2] | |
fsize=os.stat[fname].st_size = os.stat[fname].st_size | |
iter=0 = 0 | |
iflen [sys.argv]! = 3: open[sys.argv[2]] as f: | |
Print'Usage: Tail.py ' bufsize > fsize: | |
bufsize=fsize-1 = fsize-1 | |
sys.exit [1] = [] | |
# Tên tệp và số dòng được yêu cầu True: | |
iter+=1 +=1 | |
fname, nlines = sys.argv [1:].seek[fsize-bufsize*iter] | |
nlines = int [nlines].extend[f.readlines[]] | |
# Đếm tổng số dòng len[data] >= lines or f.tell[] == 0: | |
tot_lines = len [mở [fname] .ReadLines []][''.join[data[-lines:]]] | |
break |
Được xuất bản lần đầu tại Ayada.dev
Giới thiệu
Trong bài viết này, chúng tôi sẽ viết một triển khai đơn giản của lệnh tail
từ Linux. Chương trình này sẽ lấy một tệp và số nguyên n
làm đầu vào và in các dòng ____2 cuối cùng từ tệp. Ngoài ra, mục tiêu của chương trình là không đọc toàn bộ tệp vào bộ nhớ cùng một lúc. Điều này sẽ làm cho bộ nhớ chương trình hiệu quả khi xử lý các tệp rất lớn.
Chi tiết thực hiện
Để thực hiện chương trình này, chúng tôi sẽ sử dụng cấu trúc dữ liệu queue
. Chúng tôi sẽ đọc từng dòng tệp và đẩy từng dòng vào hàng đợi. Mỗi lần lặp, chúng tôi sẽ kiểm tra kích thước của hàng đợi. Khi kích thước của hàng đợi lớn hơn hoặc bằng n
, chúng tôi sẽ loại bỏ phần tử được chèn lần đầu tiên vào hàng đợi. Vì hàng đợi là cấu trúc dữ liệu FIFO, phần tử lần đầu tiên được chèn vào hàng đợi sẽ là phần tử đầu tiên sẽ được xóa khỏi hàng đợi. Điều này sẽ đảm bảo rằng hàng đợi chỉ chứa các dòng n
cuối cùng từ tệp.
Như một phần thưởng, tôi đã sử dụng argparse
để xử lý đầu vào từ CLI. Hãy xem xét việc thực hiện chương trình này.
import argparse
import queue
def tail[filename, n]:
q = queue.Queue[]
size = 0
with open[filename] as fh:
for line in fh:
q.put[line.strip[]]
if size >= n:
q.get[]
else:
size += 1
for i in range[size]:
print[q.get[]]
if __name__ == '__main__':
parser = argparse.ArgumentParser[description='Print last n lines from a file.']
parser.add_argument['file', type=str, help='File to read from']
parser.add_argument['-n', type=int, default=10, help='The last n lines to be printed']
args = parser.parse_args[]
tail[args.file, args.n]
Nhập chế độ FullScreenen EXIT Mode FullScreen