Python에서 tail 명령 구현

ayada.dev에 원래 게시됨

소개



이 기사에서는 Linux에서 tail 명령의 간단한 구현을 작성합니다. 이 프로그램은 파일과 정수n를 입력으로 사용하고 파일의 마지막n 줄을 인쇄합니다. 또한 프로그램의 목표는 전체 파일을 한 번에 메모리로 읽지 않는 것입니다. 이것은 매우 큰 파일을 다룰 때 프로그램 메모리를 효율적으로 만듭니다.

구현 세부 정보



이 프로그램을 구현하기 위해 queue 데이터 구조를 사용할 것입니다. 파일을 한 줄씩 읽고 각 줄을 대기열에 넣습니다. 반복할 때마다 대기열의 크기를 확인합니다. 큐의 크기가 n 보다 크거나 같으면 큐에 처음 삽입된 요소를 제거합니다. 큐는 FIFO 데이터 구조이므로 큐에 처음 삽입된 요소가 큐에서 제거되는 첫 번째 요소가 됩니다. 이렇게 하면 대기열에 파일의 마지막 줄n만 포함됩니다.

보너스로 cli의 입력을 처리하기 위해 argparse를 사용했습니다. 이 프로그램의 구현을 살펴보자.

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)

좋은 웹페이지 즐겨찾기