본문 바로가기
코딩교육/Python 초등교육에서 전문가까지

2단계 : 6. 파일 작업 후 반드시 닫기 - close() 와 with open의 차이와 선택기준

by 제리토리 2025. 3. 31.
728x90
반응형

 

파일을 열어서 읽거나 쓰는 작업이 끝난 후, 파일을 명시적으로 닫는 것은 매우 중요한 습관입니다.

Python에서는 open()으로 연 파일을 닫지 않으면 데이터 손실, 파일 잠금, 자원 누수 등의 문제가 발생할 수 있습니다.

 

이번 장에서는 파일을 닫는 전통적인 방법인 close()와,

Pythonic한 방식인 with open 구문의 차이점, 장단점, 그리고 실무에서의 올바른 사용 기준을 명확히 설명합니다.

 

 

1. 왜 파일을 꼭 닫아야 하는가?

 

Python에서 파일 객체를 사용하는 경우, 운영체제(OS)는 해당 파일에 대한 핸들(handle)을 유지합니다.

만약 파일을 닫지 않으면 아래와 같은 문제가 발생할 수 있습니다:

 

  🔴 자원 낭비: 파일 핸들이 시스템에 유지되어 다른 프로그램이 해당 파일에 접근 못할 수 있음.

  🔴 버퍼링 문제: 쓰기 작업 후 닫지 않으면 데이터가 실제 파일에 기록되지 않을 수 있음.

  🔴 파일 잠금: Windows에서는 닫지 않은 파일이 계속 잠긴 상태로 유지됨.

  🔴 파일 손상 위험: 예외 발생 시 파일이 완전히 저장되지 않아 손상될 수 있음.

 

 

2. 방법 1: close()로 수동으로 닫기

 

㉮ 기본 구조

file = open("example.txt", "r", encoding="utf-8")
content = file.read()
file.close()

✅ 장점:

  • 코드 흐름을 명확히 제어할 수 있음

 

❌ 단점:

  • close()실수로 생략할 가능성 있음

  • 예외 발생 시 close()가 호출되지 않아 파일이 닫히지 않을 수 있음

 

 

㉯ 예외 상황에서의 위험 예

file = open("data.txt", "r", encoding="utf-8")
content = file.read()
raise ValueError("예외 발생!")  # 이 경우 file.close()는 실행되지 않음
file.close()

➡ 위 코드는 ValueError가 발생하면서 file.close()는 호출되지 않음 → 자원 누수 발생

 

 

3. 방법 2: with open 문으로 자동으로 닫기 (권장)

 

㉮ 기본 구조

with open("example.txt", "r", encoding="utf-8") as file:
    content = file.read()
# 블록이 끝나면 자동으로 파일 닫힘

 

✅ 장점:

  • 자동으로 파일을 닫아줌 → 자원 누수 방지

  • 코드가 더 간결하고, Pythonic한 스타일

  • 예외가 발생해도 블록을 벗어나는 순간 __exit__()이 호출되어 안전하게 닫힘

 

 

㉯ 예외 발생 시 자동 닫힘 확인 예제

try:
    with open("data.txt", "r", encoding="utf-8") as f:
        print(f.read())
        raise Exception("예외 테스트")
except:
    print("예외 발생, 파일은 자동으로 닫혔습니다.")

예외가 발생해도 파일은 안전하게 닫히기 때문에, 실무에서는 항상 with 구문을 사용하는 것이 좋습니다.

 

 

4. 비교 요약: close() vs with open
항목 close() 방식 with open 방식
파일 닫기 방식 수동으로 닫아야 함 자동으로 닫힘
예외 처리 예외 발생 시 파일 닫기 실패 가능성 있음 예외 발생해도 안전하게 닫힘
코드 가독성 비교적 길고 복잡함 간결하고 직관적임
실무 권장 여부 ❌ 지양 (오래된 방식) ✅ 적극 권장 (표준 방식)

 

 

5. 실무 팁: 여러 파일 동시에 열기

 

with 구문은 한 줄에서 여러 파일을 동시에 열 수도 있음.

with open("input.txt", "r", encoding="utf-8") as infile, \
     open("output.txt", "w", encoding="utf-8") as outfile:
    for line in infile:
        outfile.write(line.upper())

✅ 입력 파일에서 데이터를 읽고, 대문자로 변환해 출력 파일에 저장하는 코드

두 파일 모두 자동으로 닫힘

 

 

6. 파일 객체 상태 확인 (file.closed)

 

파일이 정상적으로 닫혔는지 확인하려면 file.closed 속성을 사용합니다.

with open("example.txt", "r") as f:
    print(f.closed)  # False (열려 있음)
print(f.closed)      # True (닫힘)

 

 

7. 요약
항목 내용
파일 닫기 필수 메모리 누수, 데이터 손상, 파일 잠금 등을 방지하기 위해 반드시 닫아야 함
close() 수동으로 호출해야 하며, 예외 시 누락 위험
with open 자동으로 닫혀 예외에도 안전하고, 실무에서 가장 권장되는 방식
여러 파일 열기 with 문 내에서 쉼표로 구분하여 동시에 여러 파일 열수 있음

 

728x90
반응형