>백엔드 개발 >파이썬 튜토리얼 >Python(오프셋 지원 포함)에서 파일의 마지막 N 줄을 효율적으로 검색하려면 어떻게 해야 합니까?

Python(오프셋 지원 포함)에서 파일의 마지막 N 줄을 효율적으로 검색하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-17 20:01:11579검색

How Can I Efficiently Retrieve the Last N Lines of a File in Python (with Offset Support)?

Tail과 유사하게 파일의 마지막 N 줄 가져오기

소개

로그 파일 분석에는 다음과 같은 기능이 포함되는 경우가 많습니다. 가장 최근 항목을 봅니다. 이는 일반적으로 파일의 마지막 n줄을 검색하는 "tail" 명령을 사용하여 수행됩니다. 이 기사에서는 오프셋을 지원하여 tail 명령을 에뮬레이트하는 Python 메서드 구현을 살펴보겠습니다.

Tail 구현

제안된 tail() 메서드 다음과 같이 작동합니다:

  1. 아래에서 n줄을 읽습니다.
  2. 아래에서 지정된 수의 줄을 건너뛸 수 있는 오프셋 매개변수를 제공합니다.
def tail(f, n, offset=0):
    """Reads a n lines from f with an offset of offset lines."""
    avg_line_length = 74
    to_read = n + offset
    while 1:
        try:
            f.seek(-(avg_line_length * to_read), 2)
        except IOError:
            f.seek(0)
        pos = f.tell()
        lines = f.read().splitlines()
        if len(lines) >= to_read or pos == 0:
            return lines[-to_read:offset and -offset or None]
        avg_line_length *= 1.3

이 방법은 평균 줄 길이를 추정하고 이를 동적으로 조정하여 성능을 최적화합니다. .

대체 접근 방식

원래 구현에서는 가정을 합니다. 항상 사실이 아닐 수도 있는 줄 길이에 관한 것입니다. 이러한 가정을 피하는 대체 접근 방식은 다음과 같습니다.

def tail(f, lines=20):
    total_lines_wanted = lines

    BLOCK_SIZE = 1024
    f.seek(0, 2)
    block_end_byte = f.tell()
    lines_to_go = total_lines_wanted
    block_number = -1
    blocks = [] 
    while lines_to_go > 0 and block_end_byte > 0:
        if (block_end_byte - BLOCK_SIZE > 0):
            f.seek(block_number*BLOCK_SIZE, 2)
            blocks.append(f.read(BLOCK_SIZE))
        else:
            f.seek(0,0)
            blocks.append(f.read(block_end_byte))
        lines_found = blocks[-1].count('\n')
        lines_to_go -= lines_found
        block_end_byte -= BLOCK_SIZE
        block_number -= 1
    all_read_text = ''.join(reversed(blocks))
    return '\n'.join(all_read_text.splitlines()[-total_lines_wanted:])

이 방법은 파일에서 한 번에 한 블록씩 뒤로 탐색하여 줄바꿈을 세어 원하는 줄을 찾습니다.

결론

두 방법 모두 오프셋 지원을 통해 파일의 마지막 n 줄을 검색할 수 있는 실행 가능한 솔루션을 제공합니다. 대체 접근 방식은 줄 길이에 대한 가정을 피하고 대용량 파일의 경우 더 효율적일 수 있습니다.

위 내용은 Python(오프셋 지원 포함)에서 파일의 마지막 N 줄을 효율적으로 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.