40.5 연습문제: 파일 읽기 제너레이터 만들기
다음 소스 코드에서 words.txt 파일을 한 줄씩 읽은 뒤 내용을 함수 바깥에 전달하는 제너레이터를 작성하세요. 파일의 내용을 출력할 때 파일에서 읽은 \n은 출력되지 않아야 합니다(단어 사이에 줄바꿈이 두 번 일어나면 안 됨).
words.txt
compatibility experience photography spotlight
practice_generator.py
def file_read(): with open('words.txt') as file: ... for i in file_read(): print(i)
실행 결과
compatibility experience photography spotlight
정답
while True: line = file.readline() if line == '': break yield line.strip('\n')
해설
file_read는 함수이고 for i in file_read():와 같이 for 반복문에 사용하고 있습니다. 따라서 yield로 값을 바깥에 전달하는 제너레이터로 만듭니다.
먼저 file_read 함수 안에서 with open('words.txt') as file:와 같이 words.txt 파일을 열었으므로 파일 객체 file을 이용합니다. 그리고 파일을 한 줄씩 읽으라고 했으므로 readline을 사용합니다. 이때 파일에 저장된 줄 수에 상관없이 읽으려면 while True:와 같이 무한 루프로 만듭니다.
그리고 반복문 안에서는 readline으로 파일에서 한 줄을 읽은 뒤 내용이 빈 문자열 ''이면 break로 반복을 끝내고, 내용이 들어 있으면 yield로 문자열을 함수 바깥에 전달합니다. 단, 파일에서 읽은 \n은 출력하지 않아야 하므로 strip('\n')으로 \n을 삭제한 뒤 yield로 함수 바깥에 전달하면 됩니다.
이 예제에서는 파일의 용량이 작아서 별 문제가 없지만, 용량이 매우 큰 파일은 메모리에 한꺼번에 읽어서 처리하기가 힘듭니다. 따라서 대용량 데이터를 부분부분 처리해야 할 때 이렇게 제너레이터를 활용합니다.