예외란 코드 실행 중에 발생한 에러를 뜻한다. 이렇게 발생한 예외 상황을 처리할 수 있도록 프로그램의 흐름을 바꾸는 행위를 예외 처리라고 한다.
파이썬에서 예외 처리를 위해 try
, except
, else
, finally
를 사용한다.
try:
실행할 코드
except(~~):
예외가 발생했을 때 처리하는 코드
(~~)에 특정 예외 문구를 넣으면 특정 예외만 처리한다.
else:
예외가 발생하지 않았을 때 실행할 코드
finally:
예외와는 상관없이 항상 코드 실행하기
try:
x = int(input('나눌 숫자를 입력하세요: '))
y = 10 / x
# 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
except ZeroDivisionError:
print('숫자를 0으로 나눌 수 없습니다.')
# try의 코드에서 예외가 발생하지 않았을 때 실행됨
else:
print(y)
# 예외 발생 여부와 상관없이 항상 실행됨
finally:
print('코드 실행이 끝났습니다.')
Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다.
기본 구조
class 예외이름(Exception):
def __init__(self):
super().__init__('에러메시지')
예시
class Iszero(Exception): ## Exception을 상속받아야한다.
def __init__(self):
super().__init__('0은 사용할 수 없습니다.') ## 부모 객체 초기화 메서드에 원하는 메시지 입력
class NotThreeMultipleError(Exception):
def __init__(self):
super().__init__('3의 배수가 아닙니다.')
예외를 실행 시킬 땐 "raise 예외문구"로 사용한다.
raise Iszero
raise NotThreeMultipleError
def div():
try:
x = int(input('정수를 입력하세요: '))
if x == 0: # x가 0이면
raise Iszero # Iszero 예외를 발생시킴
if x % 3 != 0: # x가 3의 배수가 아니면
raise NotThreeMultipleError # NotThreeMultipleError 예외를 발생시킴
# 이때 Exception에 에러 메세지를 넣고
# 넣은 에러 메시지는 except Exception as e:의 e에 들어간다.
except Exception as e:
print('예외가 발생했습니다.', e)
div()
## 출력
정수를 입력하세요: 5
예외가 발생했습니다. 3의 배수가 아닙니다.
정수를 입력하세요: 0
예외가 발생했습니다. 0은 사용할 수 없습니다.
파이썬에서 파일을 생성하고 읽고 쓰는 파일 입출력 기능이 있다. 파일 관련 함수는 open, close, write, writeline, writelines, read, readline, readlines, seek, tell등의 함수들이 있다.
1. 파일 생성 open, close 함수
2. 파일 쓰기 write, writeline, writelines 함수
3. 파일 읽기 read, readline, readlines, seek, tell 함수
def open(file, mode='r'):
# 통상적으로 f 변수를 사용
f = open('파일경로/파일이름', 'w')
# 파일 닫기
f.close()
모드 설명
f.write('쓰고 싶은 문자열')
# writelines 함수는 매개변수로 파일에 넣을 문자열 리스트를 받습니다.
f.writelines(['a', 'b', '123', '456'])
### 줄 바꿈은 맨 끝에 개행문자(\n)을 직접 입력 해야함!
f.read(n)
파일 스트림으로 부터 해당 위치의 문자 n개를 읽어오는 함수. (n바이트를 읽어오는 것)
read() 이렇게 아무것도 넣지 않으면 모든 문자를 읽음. (반환 : 문자N개를 반환한다)
f.readlines()
해당 위치에서부터 파일의 모든 문자열을 읽어온다. (개행 포함)
반환 : List[문자열]을 반환한다.
f.readlines()
해당 위치에서부터 파일의 모든 문자열을 읽어온다. (개행 포함)
반환 : List[문자열]을 반환한다.
f.seek(위치)
해당 위치로 파일의 커서를 옮긴다. 파일의 맨 처음 위치는 0이다.
f.tell()
현재 커서의 위치를 반환하는 함수이다.
test.txt 내용을 다음과 같다 가정한다.
# test.txt
My name is Sam
파일 입출력 공부
123456
abcdef
# 파일 r 모드로 열기
f = open('C:/Test/test.txt', 'r')
'''
UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 23: illegal multibyte sequence
위 에러 발생시
f = open('C:/Test/test.txt', 'rt', encoding='UTF8')
'''
# read() 함수 이용해서 하나씩 읽어오기
print('1. read()')
print(f'위치 : {f.tell()}')
s1 = f.read(1)
print(s1,'\n')
# readline() 함수 이용해서 한 라인씩 읽어오기
print('2. readline()')
print(f'위치 : {f.tell()}')
s2 = f.readline()
print(s2)
# readlines() 함수 이용해서 모두 읽어오기
print('3. readlines()')
print(f'위치 : {f.tell()}')
s3 = f.readlines()
print(s3,'\n')
# 맨 처음 위치로 가서 한줄 읽기
print('4. seek(0), readline()')
f.seek(0)
print(f'위치 : {f.tell()}')
s4 = f.readline()
print(s4)
# 파일 닫기
f.close()
############### 출력 ###############
1. read()
위치 : 0
M
2. readline()
위치 : 1
y name is Sam
3. readlines()
위치 : 16
['파일 입출력 공부\n', '123456\n', 'abcdef']
4. seek(0), readline()
위치 : 0
My name is Sam
파일을 open() 함수를 사용해 열면 close()함수도 필수로 사용해야 한다. 하지만 with ~ as 를 사용하면 f.close()를 하지 않아도 된다.
##기존 open ~ close
f=open('hello.txt','w') #write모드
f.write('Hello Python')
f.close()
## with ~ as
# hello.txt 파일에 입력하기
with open('hello.txt','w') as f:
f.write('hello Python!!')
# hihi.txt 파일의 라인 불러오기
with open('hihi.txt','w') as f:
f1 = f.readline()
print(f1)
단, write 안에는 string만 가능하다고 한다. 그래서 str()을 이용해서 type을 변경한 후 f.write를 해야한다.