Python에서 열려 있는 모든 파일을 닫는 방법
Python에는 현재 열려 있는 모든 파일을 자동으로 추적하고 한 번에 닫아 주는 내장 기능이 없습니다. 따라서 다음 두 가지 방법 중 하나를 사용해야 합니다.
- 열리는 모든 파일 객체를 직접 목록 등에 저장하여 스스로 관리하기
- 파일을 열 때 항상
with문을 사용하기
with 문(컨텍스트 매니저)을 사용하면 코드 블록이 끝나 파일 객체가 범위를 벗어나거나, 블록 실행 도중 오류가 발생하더라도 파일이 자동으로 닫힙니다. 리소스 누수를 방지할 수 있어 가장 안전하고 권장되는 방식입니다.
예제 1: with 문 사용하기
with open('file.txt') as f:
# 여기서 f를 사용해 작업합니다
pass
여러 파일을 체계적으로 관리해야 하는 상황이라면, 모든 파일 객체를 보관하는 클래스를 만들고 하나의 close() 메서드로 전체 파일을 한 번에 닫도록 구현할 수도 있습니다.
예제 2: 파일 관리 클래스 만들기
class OpenFiles():
def __init__(self):
self.files = []
def open(self, file_name):
f = open(file_name)
self.files.append(f)
return f
def close(self):
list(map(lambda f: f.close(), self.files))
files = OpenFiles()
# open 메서드로 파일 열기
foo = files.open("text.txt", "r")
# 열려 있는 모든 파일 닫기
files.close()
참고: 파일을 제때 닫지 않으면 운영체제의 파일 핸들이 고갈되거나, 버퍼에 남아 있던 데이터가 디스크에 온전히 기록되지 않는 문제가 발생할 수 있습니다. 따라서 가능한 한 with 문을 사용하는 것이 가장 좋으며, 여러 파일을 동시에 다룰 때는 위 예제처럼 관리 클래스나 컨텍스트 매니저 패턴을 활용하는 것이 효과적입니다.