시작하기무료로 시작하기

청크 단위로 데이터를 불러오는 제너레이터 작성하기 (2)

이전 연습 문제에서는 지정한 줄 수만큼 파일을 한 줄씩 처리했어요. 하지만 전체 파일에 대해 이렇게 처리하고 싶다면 어떻게 해야 할까요?

이럴 때는 제너레이터가 유용합니다. 제너레이터를 사용하면 데이터를 지연 평가(lazy evaluation)할 수 있어요. 지연 평가는 매우 큰 데이터셋을 다룰 때 특히 유용합니다. 전체를 한 번에 가져오지 않고, 매번 필요한 데이터 조각만 yield하여 효율적으로 값을 생성할 수 있기 때문입니다.

이번 연습에서는 제너레이터 함수 read_large_file()을 정의해 보겠습니다. 이 함수는 제너레이터 객체를 만들어 주며, 여기에 next()를 호출할 때마다 파일에서 한 줄씩 반환합니다. 현재 작업 디렉터리에는 'world_dev_ind.csv' 파일이 준비되어 있습니다.

참고로, 파일 연결을 열면 만들어지는 파일 객체 자체가 이미 제너레이터입니다! 따라서 실제 현업에서는 이런 경우에 굳이 제너레이터 객체를 직접 만들 필요가 없어요. 다만 학습을 위해 여기서는 read_large_file() 함수로 이를 직접 연습해 보겠습니다. 자, 시작해 볼까요!

이 연습은 강의의 일부입니다

Python 도구 상자

강의 보기

연습 안내

  • 함수 read_large_file()에서 readline() 메서드를 사용해 file_object에서 한 줄을 읽고, 결과를 data에 할당하세요.
  • 함수 read_large_file()에서 파일에서 읽은 줄인 datayield하세요.
  • 컨텍스트 매니저 안에서, 제너레이터 함수 read_large_file()을 호출해 제너레이터 객체 gen_file을 만들고 file을 인수로 전달하세요.
  • next()를 사용하여 제너레이터 객체 gen_file이 생성한 처음 세 줄을 출력하세요.

실습형 인터랙티브 연습

이 예제를 이 샘플 코드를 완성하여 풀어보세요.

# Define read_large_file()
def read_large_file(file_object):
    """A generator function to read a large file lazily."""

    # Loop indefinitely until the end of the file
    while True:

        # Read a line from the file: data
        data = ____

        # Break if this is the end of the file
        if not data:
            break

        # Yield the line of data
        
        
# Open a connection to the file
with open('world_dev_ind.csv') as file:

    # Create a generator object for the file: gen_file
    gen_file = ____

    # Print the first three lines of the file
    print(____)
    print(____)
    print(____)
코드 편집 및 실행