2021년 7월 18일 일요일

python 으로 만드는 tail line


앞에서 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의 읽는 위치를 조금 더 앞쪽에서 읽도록 하게 합니다.



댓글 없음:

댓글 쓰기