본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 메모리 효율을 결정하는 2가지 파일 읽기 기법 : readline()과 readlines()의 결정적 차이 및 대용량 데이터 해결 방법

by Papa Martino V 2026. 3. 11.
728x90

readline()과 readlines()
readline()과 readlines()

 

파이썬(Python)을 이용한 데이터 처리 과정에서 파일 입출력은 가장 빈번하게 발생하는 작업입니다. 특히 텍스트 파일을 한 줄씩 읽어 처리해야 할 때, 우리는 readline()readlines()라는 두 가지 선택지 사이에서 고민하게 됩니다. 겉보기에는 비슷해 보이지만, 내부적인 동작 방식과 메모리 점유율 측면에서는 극명한 차이를 보입니다. 본 글에서는 이 두 메서드의 본질적인 특성을 분석하고, 실무에서 수 기가바이트(GB) 이상의 대용량 파일을 다룰 때 발생하는 성능 병목 현상을 해결하는 전문적인 방법을 제시합니다.


1. readline()과 readlines()의 본질적 동작 메커니즘

파일 객체는 기본적으로 이터레이터(Iterator)처럼 동작하며, 포인터(Pointer) 위치에 따라 읽기 작업을 수행합니다. 두 함수의 핵심적인 차이는 '한 번에 얼마나 많은 데이터를 메모리에 올리느냐'에 있습니다.

  • readline(): 파일에서 단 한 줄만을 읽어 문자열(String)로 반환합니다. 호출될 때마다 파일 포인터가 다음 줄로 이동하며, 파일의 끝에 도달하면 빈 문자열을 반환합니다.
  • readlines(): 파일의 모든 줄을 읽어 각 줄을 요소로 갖는 리스트(List) 형태로 반환합니다. 파일 전체 내용을 한꺼번에 메모리에 로드하기 때문에 데이터 접근 속도는 빠르지만 메모리 소모가 큽니다.

2. 메모리 점유 및 반환 타입에 따른 결정적 차이 비교

프로젝트의 데이터 규모에 따라 어떤 메서드를 선택해야 할지 판단하기 위한 상세 비교 분석표입니다.

비교 항목 readline() readlines() 비고 및 해결 전략
반환 데이터 타입 문자열 (str) 리스트 (list of str) 단일 처리 vs 일괄 처리
메모리 사용량 매우 낮음 (한 줄 단위) 매우 높음 (전체 파일 크기 비례) 대용량 파일 시 차이 극대화
실행 속도 (대형 파일) 반복 호출로 인해 상대적으로 느림 초기 로딩 시 매우 느림/메모리 부족 위험 시스템 리소스 안정성 해결
파일 포인터 제어 호출 시마다 순차 이동 한 번에 끝(EOF)까지 이동 데이터 탐색 방법의 차이
주요 권장 용도 대용량 로그 파일, 실시간 스트림 작은 설정 파일, 전체 데이터 무작위 접근 파일 크기 100MB 기준 선택 권장

3. [Sample Example] 상황별 최적의 파일 읽기 해결 방법

실제 개발 현장에서 마주할 수 있는 두 가지 전형적인 사례를 통해 올바른 코드 작성 방법을 살펴봅니다.

상황 1: readlines()를 이용한 전체 리스트 가공 (작은 파일)

# config.txt 내용이 적을 때 한꺼번에 리스트로 받아 처리
def process_config(file_path):
    try:
        with open(file_path, "r", encoding="utf-8") as f:
            lines = f.readlines()
            # 리스트이므로 인덱싱이나 정렬이 자유로움
            header = lines[0]
            data = sorted(lines[1:])
            print(f"총 {len(data)}개의 설정을 로드했습니다.")
    except FileNotFoundError:
        print("해결: 설정 파일을 찾을 수 없습니다.")

process_config("settings.conf")
    

상황 2: readline()을 이용한 메모리 절약형 한 줄 읽기 (큰 파일)

# 수 GB의 로그 파일을 처리할 때 메모리 에러를 방지하는 해결 방법
def tail_log(file_path):
    with open(file_path, "r", encoding="utf-8") as f:
        while True:
            line = f.readline()
            if not line: # 파일 끝에 도달하면 중단
                break
            if "ERROR" in line:
                print(f"에러 발견: {line.strip()}")

tail_log("server_huge_log.txt")
    

4. 전문가가 제안하는 3단계 고성능 파일 처리 전략

  1. 제너레이터(Generator) 활용: 사실 파이썬에서는 for line in f:와 같이 파일 객체를 직접 순회하는 방식이 가장 훌륭한 방법입니다. 이는 readline()의 메모리 효율성과 높은 가독성을 동시에 해결합니다.
  2. 줄바꿈 문자(\n) 처리: 두 메서드 모두 줄바꿈 문자를 포함하여 읽어옵니다. 데이터를 깨끗하게 처리하려면 반드시 line.strip()이나 line.rstrip('\n')을 병행하여 불필요한 공백 문제를 해결해야 합니다.
  3. 인코딩 명시: 대용량 텍스트 처리 시 운영체제 기본값에 의존하지 말고 encoding="utf-8"을 명시하여 데이터 깨짐 현상을 사전에 방지하세요.

5. 결론: 데이터 규모에 따른 유연한 아키텍처 설계

readline()readlines()는 단순한 기능의 차이를 넘어, 개발자가 시스템 자원을 얼마나 깊이 이해하고 있는지를 보여주는 지표입니다. 작은 데이터에는 readlines()의 편의성을 활용하고, 끝을 알 수 없는 대용량 데이터에는 readline()이나 파일 반복문을 통한 메모리 최적화 방법을 선택하는 것이 정답입니다. 본 가이드를 통해 채원님의 프로젝트가 성능과 안정성이라는 두 마리 토끼를 모두 잡는 해결책을 찾으시길 바랍니다.


[내용 출처 및 참고 문헌]

  • Python Software Foundation. "Input and Output - Methods of File Objects."
  • Real Python. "How to Read and Write Files in Python."
  • High Performance Python: Practical Performant Programming for Humans by Micha Gorelick.
728x90