공부 정리/파이썬

정말 쉽고 편한 컨텍스트 관리자 Context Manager 기능

cysk 2025. 10. 27. 17:25

컨텍스트 관리자는 어떤 작업의 시작과 종료를 관리하는 객체다.

파일, 데이터베이스 연결, 스레드 잠금 등 반드시 닫거나 해제해야 하는 자원을 다룰 때 쓰인다. 

 

코드 예시 

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