소개
로그 파일 분석에는 다음과 같은 기능이 포함되는 경우가 많습니다. 가장 최근 항목을 봅니다. 이는 일반적으로 파일의 마지막 n줄을 검색하는 "tail" 명령을 사용하여 수행됩니다. 이 기사에서는 오프셋을 지원하여 tail 명령을 에뮬레이트하는 Python 메서드 구현을 살펴보겠습니다.
Tail 구현
제안된 tail() 메서드 다음과 같이 작동합니다:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!