3.6.2 파일 열기와 닫기 (open, with)
학습목표
파이썬 내장 함수인 open()을 사용하여 하드디스크의 파일을 열고 데이터를 읽고(r) 쓰는(w, a) 모드의 차이를 학습합니다. 특히, 열려 있는 파이프 관을 닫는 close() 함수의 100% 실행 보장을 위해 자바의 무거운 finally 블록 대신, 파이썬만의 가장 아름답고 안전한 문법 인프라인 with open() 구문을 마스터합니다.
💡 TL;DR (1분 핵심 요약): 파이프 관리법
open("파일명", "모드"): 하드디스크 파일에 파이프 관을 꽂습니다. (r=읽기,w=다 지우고 새로 쓰기,a=덧붙여 쓰기)close()생략의 재앙: 파이프를 꽂았으면 반드시close()로 뽑아줘야 합니다. 안 뽑으면 다른 프로그램이 해당 파일을 만질 수 없는 심각한 데드락 상태가 옵니다.with open(...) as f:(컨텍스트 매니저):close()를 까먹는 인간의 실수를 원천 차단하기 위해, 들여쓰기 공간이 끝나면 “설령 치명적인 에러가 터지더라도 알아서 파이프를 뽑아주는” 파이썬 최고의 마법 문법입니다.
1. 파일 열기 모드의 3대장 (r, w, a)
파일에 파이프를 꽂을 때, 내가 데이터를 빨아들일지 뱉어낼지 그 성격을 명확히 지정해 주어야 합니다.
r(Read, 읽기): 이미 존재하는 일기장을 눈으로 읽기만 합니다. (파일이 없으면 빨간줄 에러가 납니다!)w(Write, 쓰기): 펜을 들고 일기장에 글을 씁니다. 주의할 점은, 예전에 적어둔 글씨가 있다면 전부 폭파시키고 백지상태에서 새로 씁니다. (파일이 없으면 친절하게 자기가 새로 만들어냅니다.)a(Append, 추가): 도장 깨기처럼, 기존 일기장 내용을 보호한 채 맨 끝 꼬리에 글을 살포시 이어 덧붙입니다. (로그 기록 남길 때 필수입니다.)
2. 파일 I/O의 암묵적 규칙과 with의 마법
파일을 열고(open), 읽고(read), 닫는(close) 아주 고전적이고 원시적인 방법입니다.
# (주의) 이렇게 짜면 하수입니다.
f = open("my_diary.txt", "w", encoding="utf-8")
f.write("오늘은 파이썬 시각화를 배우는 날이다.\n")
# 만약 여기서 컴퓨터에 벼락이 쳐서 코드가 에러로 팅긴다면?
f.close() # <- 영원히 이 코드는 실행되지 못하고 좀비 파일이 됩니다.
✨ 고수의 방식: with (컨텍스트 매니저)
파이썬 개발자들은 위와 같은 좀비 파이프 사태를 막기 위해 with 라는 마법의 영역을 창조했습니다.
# 'with' 들여쓰기 공간이 끝나는 순간, 에러가 터지든 정상 종료되든 f.close()를 무조건 자동 실행해버립니다!
with open("my_diary.txt", "w", encoding="utf-8") as f:
f.write("나는 절대 망가지지 않는 안전한 파일에 글을 적고 있다.\n")
f.write("with 블록 최고!\n")
# 여기서 들여쓰기가 끝났으므로 f.close() 자동 발동! 이 파일은 안전하게 저장되었습니다.
# 방금 쓴 파일 읽어오기
with open("my_diary.txt", "r", encoding="utf-8") as f:
content = f.read() # 파일 통째로 다 빨아오기
print("터미널에 방금 적은 글 출력:\n", content)
☕ Java vs 🐍 Python 스나이퍼 대결
try-catch-finally의 저주를 푸는 파이썬
- Java: 파일 하나를 읽고 안전하게 닫으려면 입에서 험한 말이 나옵니다.
BufferedReader br = null;선언부터 시작해try { br = new BufferedReader(...) } catch(Exception e) {} finally { if(br != null) try { br.close(); } catch(Exception e) {} }라는 미친 듯이 흉측하고 장황한 20줄짜리 뼈대 코드를 피눈물 흘리며 작성해야 파이프 누수를 막을 수 있습니다. - Python: 오직
with open("파일") as f:한 줄로 끝납니다. 이with블록을 빠져나가는 순간 내부 깊은 곳의__exit__매직 메서드가 발동하여 하늘이 무너져도close()를 보장해 줍니다. 인간의 실수 확률을 0%로 떨어뜨리는 파이썬 문법의 대용단입니다.
코딩 영단어 학습 📝
- Context Manager (컨텍스트 매니저): 문맥(상황) 관리자. (
with구문과 연결된 파이썬의 핵심 기법. 파일 열기나 DB 접속처럼 “무조건 마지막에 안전하게 닫고 정리(Clean up)해 줘야 하는 위험한 파이프”들을 관리하기 위해, 블록이 끝날 때 뒷수습을 자동화해 주는 스마트한 비서입니다.) - Encoding (인코딩): 암호화 조립. (우리가 쓰는 ‘한글’을 0과 1로 된 하드디스크 파일에 적어넣을 때 사용하는 번역 사전입니다. 윈도우 한글과 맥 한글이 깨지는 것을 막기 위해 전 세계 표준인
encoding="utf-8"파라미터를 무조건 습관적으로 달아주는 것이 좋습니다.) - Append (어펜드): 살포시 덧붙이다. (파이썬 리스트 파트에서
.append()로 맨 뒤에 데이터를 밀어 넣던 것과 똑같은 원리입니다. 파일 모드"a"를 쓰면 기존 파일을 죽이지 않고 엉덩이 뒤에 글씨를 쓰기 시작합니다.)
서브목차