앞에서 tail byte 로 구현하였습니다.
https://swlock.blogspot.com/2021/07/python-tail-byte.html
이번에는 tail line으로 구현해보았습니다.
tail line은 뒤에서 부터 라인수 만큼만 데이터를 가져오는 동작입니다.
11_tail_line.py
import os def get_tail_line(fname,lines): fsize = os.stat(fname).st_size bufsize = fsize/1024+1 iter = 0 if lines == 0: return '' with open(fname) as f: if bufsize > fsize: bufsize = fsize-1 while True: iter +=1 f.seek(fsize-bufsize*iter) data = [] data.extend(f.readlines()) if len(data) > lines or f.tell() == 0: #print(data) return (''.join(data[-(lines):])) if __name__ == "__main__": print(get_tail_line("11_tail_line.py",6))
실행화면
C:\>python 11_tail_line.py if len(data) > lines or f.tell() == 0: #print(data) return (''.join(data[-(lines):])) if __name__ == "__main__": print(get_tail_line("11_tail_line.py",6))
코드 설명
f.seek(fsize-bufsize*iter) 뒤에서 부터 읽기위해서 전체 크기에서 위치를 빼줍니다.
data = []
data.extend(f.readlines())
위 코드에 의해서 현재 시점의 파일끝까지 line을 읽어서 라인을 만듭니다. 우리가 원하는 라인이 만들어졌다고 판단되면 결과를 리턴하게 되는데
if len(data) > lines or f.tell() == 0: #print(data) return (''.join(data[-(lines):]))
만약 해당 조건을 만족하지 않는다면 line의 갯수가 충분하지 않는다는 뜻이기 때문에 좀 더 앞쪽에서 부터 읽도록 합니다. 그러기 위해서는 iter +=1 를 해주게 되고 이 값은 f.seek의 읽는 위치를 조금 더 앞쪽에서 읽도록 하게 합니다.
댓글 없음:
댓글 쓰기