1단계 : 9. 함수와 모듈 (feat. 파일 작업에서 예외 처리)
파일 작업 중에는 파일이 존재하지 않거나 읽기/쓰기 권한이 없는 등 여러 예외 상황이 발생할 수 있습니다. Python에서는 **예외 처리(Exception Handling)**를 통해 파일 작업의 안정성을 높이고 프로그램의 중단을 방지할 수 있습니다. 이 장에서는 파일 작업 중 발생할 수 있는 주요 예외와 이를 처리하는 방법을 살펴봅니다.
1. 예외 처리의 필요성
파일 작업 중 다음과 같은 문제를 방지하려면 예외 처리가 필요합니다:
• 파일 없음: 열려고 하는 파일이 존재하지 않을 때.
• 쓰기 권한 부족: 파일 쓰기 작업 시 권한이 없을 때.
• 잘못된 경로: 경로가 올바르지 않을 때.
• 파일 포맷 오류: 파일의 내용이 예상한 형식이 아닐 때.
Python에서는 try-except 구문을 사용하여 이러한 상황을 처리할 수 있습니다.
2. 기본 예외 처리: try-except
try-except 구문은 예외가 발생할 가능성이 있는 코드를 처리하는 기본적인 방법입니다.
㉮ 기본 구조
try:
파일 작업 코드
except 예외타입:
예외 발생 시 실행할 코드
예제: 파일 열기 예외 처리
try:
file = open("nonexistent.txt", "r")
content = file.read()
file.close()
except FileNotFoundError:
print("파일이 존재하지 않습니다.")
결과:
파일이 존재하지 않습니다.
3. 주요 예외 종류와 처리 방법
㉮ FileNotFoundError
파일이 존재하지 않을 때 발생합니다.
예제
try:
file = open("data.txt", "r")
content = file.read()
except FileNotFoundError:
print("지정된 파일을 찾을 수 없습니다.")
㉯ PermissionError
파일에 대한 읽기 또는 쓰기 권한이 없을 때 발생합니다.
예제
try:
file = open("/root/protected.txt", "w")
file.write("Hello")
except PermissionError:
print("파일에 대한 쓰기 권한이 없습니다.")
㉰ IsADirectoryError
파일 대신 디렉터리를 열려고 할 때 발생합니다.
예제
try:
file = open("some_directory", "r")
except IsADirectoryError:
print("디렉터리가 아닌 파일을 지정하세요.")
㉱ IOError
파일 작업 중 일반적인 입출력 오류가 발생할 때 발생합니다.
예제
try:
file = open("data.txt", "r")
except IOError:
print("파일 작업 중 오류가 발생했습니다.")
4. finally 블록으로 자원 정리
파일 작업 후 파일을 반드시 닫아야 하는 경우, finally 블록을 사용하여 정리 작업을 수행합니다.
㉮ 기본 구조
try:
파일 작업 코드
except 예외타입:
예외 발생 시 실행할 코드
finally:
정리 작업
예제: 파일 닫기 보장
try:
file = open("example.txt", "r")
content = file.read()
except FileNotFoundError:
print("파일이 존재하지 않습니다.")
finally:
if 'file' in locals() and not file.closed:
file.close()
print("파일이 닫혔습니다.")
5. with문으로 예외 처리 간소화
with문은 파일 작업에서 파일 닫기를 자동으로 처리해주기 때문에 예외 처리 시 유용합니다.
예제
try:
with open("example.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
6. 사용자 정의 예외 처리
필요에 따라 사용자 정의 예외를 생성하고 처리할 수 있습니다.
예제
class FileTooLargeError(Exception):
pass
try:
file = open("large_file.txt", "r")
content = file.read()
if len(content) > 10000:
raise FileTooLargeError("파일이 너무 큽니다.")
except FileTooLargeError as e:
print(e)
7. 파일 작업 예외 처리 실용 예제
㉮ 사용자 입력 파일 열기
filename = input("열 파일 이름을 입력하세요: ")
try:
with open(filename, "r") as file:
print(file.read())
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
except PermissionError:
print("파일에 대한 접근 권한이 없습니다.")
㉯ 데이터 쓰기 및 읽기 예외 처리
try:
with open("output.txt", "w") as file:
file.write("Python 예외 처리 연습!")
except IOError:
print("파일에 데이터를 쓰는 중 문제가 발생했습니다.")
㉰ 파일 존재 여부 확인 후 작업
import os
filename = "example.txt"
if os.path.exists(filename):
with open(filename, "r") as file:
print(file.read())
else:
print("파일이 존재하지 않습니다.")
8. 예외 처리 시 주의사항
㉮ 특정 예외만 처리하기:
• 너무 일반적인 예외(Exception)를 처리하면 디버깅이 어려워질 수 있습니다.
except Exception:
print("알 수 없는 오류가 발생했습니다.") # 사용 시 주의
㉯ 파일 작업의 정리 보장:
• 파일을 반드시 닫아야 하는 경우 finally 블록 또는 with문을 사용하세요.
㉰ 오류 메시지 출력:
• 발생한 예외에 대한 상세한 정보를 출력하려면 e 객체를 사용하세요.
except FileNotFoundError as e:
print(f"오류: {e}")
㉱ 예외 조건 최소화:
• 파일이 존재하는지 사전에 확인하여 불필요한 예외를 방지하세요.
9. 요약
파일 작업 중 예외는 언제든 발생할 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 중단될 수 있습니다. Python의 try-except 구문과 with문을 활용하면 파일 작업의 안정성을 높이고, 다양한 예외 상황에 대응할 수 있습니다.
핵심 정리
㉮ 주요 예외 종류:
• FileNotFoundError, PermissionError, IsADirectoryError, IOError.
㉯ try-except 구문:
• 파일 작업 중 발생할 수 있는 예외를 처리.
㉰ finally 블록:
• 자원 정리를 보장.
㉱ with문:
• 파일 닫기를 자동으로 처리하여 간결한 코드 작성 가능.