파일을 열어서 읽거나 쓰는 작업이 끝난 후, 파일을 명시적으로 닫는 것은 매우 중요한 습관입니다.
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 문 내에서 쉼표로 구분하여 동시에 여러 파일 열수 있음 |
'코딩교육 > Python 초등교육에서 전문가까지' 카테고리의 다른 글
2단계 : 6. 실습 : 파이썬 파일 관리 시스템 (0) | 2025.04.02 |
---|---|
2단계 : 6. 파일 작업 중 예외 처리 (파일이 없는 경우) (0) | 2025.04.01 |
2단계 : 6. 파일 쓰기 - write() 와 writelines 완벽 이해 (0) | 2025.03.30 |
2단계 : 6. 파일 읽기 - read(), readline(), readlines() (0) | 2025.03.28 |
2단계 : 6. 텍스트 파일 열기 (open() 함수와 파일 모드) (0) | 2025.03.27 |