컨텍스트 관리자는 어떤 작업의 시작과 종료를 관리하는 객체다.
파일, 데이터베이스 연결, 스레드 잠금 등 반드시 닫거나 해제해야 하는 자원을 다룰 때 쓰인다.
코드 예시
with open('data.txt', 'w') as f:
f.write('hi')
컨텍스트 관리자가 없는 예시
f = open('data.txt', 'w')
f.write('hi')
f.close()
컨텍스트 관리자가 없을 때의 문제를 살펴보면 f.write()와 f.close() 사이에서 예외가 발생하면 f.close()가 호출되지 않는다는 것이다. 이로인해 자원이 해제되지 않고 시스템에 남아있게 될 수 있다.
이에 대한 전통적인 해결책으로는 try-finally를 사용하는것인데 finally 블록은 try블록에서 예외가 발생하더라도 항상 실행되기 때문이다.
f = None
try:
f = open('test.txt', 'w')
f.write('hello\n')
# result = 10 / 0
finally:
if f is not None:
f.close()
result에서 오류가 나도 finally는 항상 실행된다. 그러나 코드가 길어지고 손목도 점점 아파지게 된다.
이에 대한 해결책인 with를 이용한 예시
with open('test.txt', 'w') as f:
f.write('hi')
여기서 open()이 반환하는 파일 객체(f)가 컨텍스트 관리자이다.
나는 이것을 회귀나 분석결과, 컬럼별 결측치의 자료 저장용으로 사용하는데
with open('smote_reg.txt', 'w', encoding='utf-8') as f:
for i, (name, result) in enumerate(results.items(), 1):
f.write(f"\n{'='*70}\n{i}. {name} x 재구매율\n{'='*70}\n")
f.write(str(result.summary()) + "\n")
df = pd.read_csv('02_preprosessed_data.csv')
mcs= "컬럼별 결측치 개수\n"
for col in df.columns:
missing_c = df[col].isnull().sum()
mcs += f"'{col}' : {missing_c}개\n"
with open('02결측치.txt', 'w', encoding='utf-8') as f:
f.write(mcs)


저장 할 수 있어서 전처리 과정에 따른 차이를 따로 메모할 필요가 없고, print()나 display()에서 짤리거나, 이상하게 나올 걱정이 없어서 정말 편하다.
'공부 정리 > 파이썬' 카테고리의 다른 글
| 딕셔너리 및 세트 컴프리헨션 (0) | 2025.10.29 |
|---|---|
| 리스트 컴프리헨션 List Comprehension (0) | 2025.10.24 |