프로그래밍백엔드 개발자

Python에서 with open의 작동 방식에 대해 설명해 주세요. 파일을 열고 닫는 순간에 어떤 일이 발생하며, 여기서 어떤 함정이 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

with open(...) as f:는 컨텍스트 관리자(context manager)를 통해 파일 작업을 수행하는 표준 방법입니다. 이 접근 방식을 사용하면 Python은 블록 with를 벗어날 때 파일이 자동으로 닫히도록 보장하며, 예외가 발생하더라도 마찬가지입니다. 이는 파일 디스크립터 유출 및 파일 잠금을 방지합니다.

블록 내부에서는 객체의 메서드(f.read(), f.write() 등)를 사용하여 파일 작업을 수행할 수 있습니다. 블록을 벗어나는 순간(오류가 발생하더라도) f.close() 메서드가 호출됩니다.

예시:

with open('data.txt', 'w') as f: f.write('Hello!') # 여기서 파일은 이미 닫혔습니다

단서가 있는 질문.

자주 묻는 질문:

open을 통해 열린 파일이 블록 with를 벗어난 직후 즉시 닫힐 것이라고 확신할 수 있습니까? 블록 중간에 예외가 발생하더라도?

답변: 네, 바로 그것이 컨텍스트 관리자의 계약이 보장하는 것입니다. 예외에 상관없이 블록을 벗어날 때 __exit__ 메서드가 호출되어 파일이 닫히게 됩니다. 이는 명시적으로 f.close()를 호출하는 것과 비교했을 때 주요 장점입니다.

주제에 대한 무지로 인한 실제 오류 사례.


이야기

대규모 프로젝트에서 로그 작성을 open('log.txt', 'a')와 명시적 호출 f.write()를 통해 수행했지만 f.close()를 잊어버렸습니다. 장시간 작업 후 프로세스가 모든 파일 디스크립터를 소모하였고, 서비스가 작동을 멈췄습니다.


이야기

모니터링 시스템에서는 open을 통해 파일을 지속적으로 열었지만 예외 처리를 하지 않았습니다. 오류 발생 시 파일이 여전히 열려 있어서 다른 프로세스에서 다시 열 시도 시 잠금이 발생했습니다.


이야기

개발자는 open을 통해 큰 파일을 읽는 작업을 구현하고 함수 중간에 return을 해서 파일을 닫지 않았습니다. 그 결과 이러한 작업이 몇 번 반복되면서 파일 리소스가 고갈되었고, OS가 새로운 열기를 차단하게 되었습니다.