[Python] 9. 예외 처리와 파일

YJ·2024년 12월 5일

Python 공부하기

목록 보기
10/13
post-thumbnail

본 블로그 글은 박동민·강영민 저자님의 으뜸파이썬 교재를 참고하여 만들어진 글임을 밝힙니다.

예외 처리와 파일 처리

예외 처리

  • 오류 : 프로그램 실행 중 특정 상황에서 발생하는 문제로, 잘못된 문법, 실행 중 예기치 못한 상황 등이 원인이 될 수 있다.
  • 오류의 종류
    • 구문 오류 (Syntax Error)
      • 코드의 문법이 잘못되어 프로그램이 실행되지 않음
    • 예외 (Exception)
      • 실행 중 발생하는 오류로, 프로그램은 실행되지만, 특정 상황에 문제가 발생함
  • 특히, 예외의 경우 실행 중에 발생하기 때문에 try-except같은 구문을 통해 예외 처리(Except Handling)가 가능하다.

형식

예외 처리 구문

try:
    [예외가 발생할 가능성이 있는 코드]
except [예외 유형]:
    [예외 발생 시 실행할 코드]
else:
    [예외가 발생하지 않았을 때 실행할 코드]  # 선택적
finally:
    [예외 발생 여부와 관계없이 항상 실행할 코드]  # 선택적

실습

잘못된 입력에 관한 예외 처리

try :
	a, b = map(int, input('두 수를 입력하세요 : ').split())
	result = a / b
	print(f'{a} / {b} = {result}')
except:
	print('정확한 수를 입력하세요')
  • 이 경우  ValueErrorZeroDivisionError 등의 오류를 처리한다.
    • ValueError : 숫자가 아닌 값을 입력했을 때 발생
    • ZeroDivisionError : 0으로 나누려고 할 때 발생

예외 처리 및 예러 종류 출력하기

try :
	a, b = map(int, input('두 수를 입력하세요 : ').split())
	result = a / b
	print(f'{a} / {b} = {result}')
except Exception as e:
	print('error :', e)
	print('정확한 수를 입력하세요')

예외마다 서로 다른 에외 처리

try:
    a, b = map(int, input('두 수를 입력하세요 : ').split())
    result = a / b
    print(f'{a} / {b} = {result}')
except ValueError:  # 숫자가 아닌 값을 입력했을 때 처리
    print("error: 숫자를 입력하세요.")
except ZeroDivisionError:  # 0으로 나누려고 할 때 처리
    print("error: 0으로 나눌 수 없습니다.")
except Exception as e:  # 그 외 모든 예외 처리
    print("error:", e)
    print("예기치 못한 오류가 발생했습니다.")

try-except-else 구문

try:
    a, b = map(int, input('두 수를 입력하세요 : ').split())
    result = a / b
except ValueError:  # 숫자가 아닌 값을 입력했을 때 처리
    print("error: 숫자를 입력하세요.")
except ZeroDivisionError:  # 0으로 나누려고 할 때 처리
    print("error: 0으로 나눌 수 없습니다.")
except Exception as e:  # 그 외 모든 예외 처리
    print("error:", e)
    print("예기치 못한 오류가 발생했습니다.")
else:  # 예외가 발생하지 않았을 때 실행
    print(f'{a} / {b} = {result}')
    print("계산이 성공적으로 완료되었습니다!")

try-except-else-finally 구문

try:
    a, b = map(int, input('두 수를 입력하세요 : ').split())
    result = a / b
except ValueError:  # 숫자가 아닌 값을 입력했을 때 처리
    print("error: 숫자를 입력하세요.")
except ZeroDivisionError:  # 0으로 나누려고 할 때 처리
    print("error: 0으로 나눌 수 없습니다.")
except Exception as e:  # 그 외 모든 예외 처리
    print("error:", e)
    print("예기치 못한 오류가 발생했습니다.")
else:  # 예외가 발생하지 않았을 때 실행
    print(f'{a} / {b} = {result}')
    print("계산이 성공적으로 완료되었습니다!")
finally:  # 예외 발생 여부와 관계없이 항상 실행
    print("프로그램을 종료합니다.")

Built-in Exception

  • Exception은 클래스로 정의되어 있어, 새로운 예외를 만드는게 가능하다.
  • 이때 Exception 클래스를 상속받아 구현한다.

raise 문

  • 예외를 강제로 발생할 때 사용하는 구문이다.

예시

class MyCustomError(Exception):  # Exception 클래스 상속
    def __init__(self, message):
        self.message = message

try:
    raise MyCustomError("이것은 사용자 정의 예외입니다!")  # 예외 발생
except MyCustomError as e:
    print(f"Custom Exception Caught: {e.message}")

파일 처리

  • 파일: 데이터를 영구적으로 저장하기 위해 하드디스크 등에 저장된 데이터의 단위. 텍스트 파일, 바이너리 파일 등 다양한 형태가 있다.
  • 프로그램이 외부 파일과 데이터를 주고받는 작업을 파일 입출력이라고 한다.
    • 입력(Input): 파일에서 데이터를 읽어오는 작업
    • 출력(Output): 데이터를 파일에 쓰는 작업

파일 처리 절차

  1. 파일 열기
    • 저장 장치 내의 파일 위치(path)로부터 파일을 가져온다.
  2. 파일 읽기, 쓰기 또는 내용 수정하기
    • 파일을 사용 목적에 따라 처리한다.
  3. 파일 닫기
    • 파일을 모두 사용하고 나서 메모리를 시스템에서 사용할 수 있도록 반환한다.

파일 모드 종류

모드설명
r읽기 모드. 파일이 존재해야 하며, 읽기 전용으로 엶
w쓰기 모드. 파일이 없으면 생성, 기존 파일은 내용 삭제
a추가 모드. 파일이 없으면 생성, 기존 내용 뒤에 추가
r+읽기 및 쓰기 모드. 파일이 존재해야 함
w+읽기 및 쓰기 모드. 파일이 없으면 생성, 기존 내용 삭제
a+읽기 및 추가 모드. 파일이 없으면 생성

💡 바이너리 파일이란?

  • 데이터를 이진 데이터(0과 1)로 저장하며, 사람이 읽을 수 없는 형식을 말한다.
  • 이미지, 오디오, 동영상, 실행 파일 등 멀티미디어 데이터를 저장할 때 사용한다.
  • 바이너리 모드로 파일 처리시에는 b와 함께 사용한다.
    • rb: 바이너리 읽기 모드
    • wb: 바이너리 쓰기 모드
    • ab: 바이너리 추가 모드

실습

파일 쓰기

f = open('hello.txt', 'w') # 파일을 쓰기 모드로 열기
f.write('Hello World!')
f.close()
  • 참고로 open 의 경우 encoding 인자와 함께 인코딩 형식 지정이 가능하다.
    • utf-8 : 유니코드 표준 인코딩 (가장 널리 사용됨)
    • ascii : 기본 ASCII 문자 집합 (영문 알파벳 및 기호)
    • latin-1 : ISO-8859-1, 유럽 언어 지원
    • cp949 : 한국어 윈도우 기본 인코딩 (EUC-KR 기반)
    • euc-kr : 한국어 EUC-KR 인코딩
    • utf-16 : 2바이트 유니코드
    • utf-32 : 4바이트 유니코드

파일 읽기

f.read()

f = open('hello.txt', 'r') # 파일을 읽기 모드로 열기
s = f.read()
print(s)
f.close()
f = open('hello.txt', 'r') # 파일을 읽기 모드로 열기
s = f.read(5) # 5개의 문자 읽기
print(s)
f.close()
  • f.read()의 경우 숫자를 넣으면 숫자만큼만 읽어온다.

f.readline()

f = open('foo.txt', 'r')
s = f.readline().rstrip()
print(s)
s = f.readline().rstrip()
print(s)
f.close() 

파일 추가하기

f = open('foo.txt', 'a+') # 파일 읽기 및 추가하기
f.write(400)
f.close()

with-as 문

  • 파일 작업, 데이터베이스 연결 등과 같이 자원을 열고 닫는 과정에서 자동으로 자원을 관리하기 위해 사용하는 구문이다.
  • Context Manager를 사용하여 코드를 더 간결하고 안전하게 작성할 수 있다.
    • __enter__와 __exit__ 메서드를 구현하여, 자원을 열고 닫는 작업을 관리하는 객체
      • __enter__ : 컨텍스트에 들어갈 때 자동으로 실행
      • __exit__ : 컨텍스트에서 나올 때 자동으로 실행
  • 가장 일반적으로 파일 작업에서 많이 사용된다.

실습

일반적인 구문

f = open('hello.txt', 'w')
f.write('Hello World!')
f.close()

try-finally 구문

f = open('hello.txt', 'w')  
try:
    f.write('Hello World!') 
finally:
    f.close()  

with-as 구문

with open('hello.txt', 'w') as f:  
    f.write('Hello World!') 
# with 블록 종료 후 파일이 자동으로 닫힘
profile
제 글이 유익하셨다면 ♡와 팔로우로 응원 부탁드립니다.

0개의 댓글