스터디/파이썬 스터디 강의자료

[1팀/한규림] 10주차 파이썬 스터디 - 예외처리

onegyul 2023. 6. 1. 17:00

10차시_강의안_예외처리.pdf
0.32MB
10차시_과제_예외처리.pdf
0.12MB

10주차 강의 주제는 예외처리와 파일 다루기 입니다.

1. 예외 처리

1) 예외의 개념과 사례

예외 exception : 프로그램을 개발하면서 예상하지 못한 상황이 발생하는 것

  • 입력 오류 - 웹 사이트에 가입하여 아이디를 생성하려 하는 상황. 일반적으로 아이디는 영문자나 숫자를 지원하는데 때로는 사용자가 한글로 아이디를 만들기 위해 한글 입력을 시도할 때가 있음. 이러한 경우 입력된 한글이 그대로 데이터베이스에 저장되면 자칫 사용자가 해당 웹 사이트에 로그인하지 못할 수도 있음. 프로그래머의 실수로 인코딩에 문제가 발생하여 데이터베이스에 한글이 잘못 저장될 수도 있는 상황. 사용자가 이러한 실수를 하지 않도록 해야함.
  • 자동 저장 기능(autosave) - 컴퓨터가 갑자기 종료되었을 때를 대비하여 작업한 것을 중간에 자동으로 저장해주는 기능

이러한 사례처럼 프로그램을 실제로 작성하고 실행하다 보면 예상치 못한 일들이 많이 발생하는데, 이를 예외라고 한다.

2) 예측 가능한 예외 & 예측 불가능한 예외

  1. 예측 가능한 예외
  • 발생 여부를 개발자가 사전에 인지할 수 있는 예외를 말함
  • 예) 텍스트 박스에 사용자가 실수로 잘못된 값을 입력할 것 같다, 사용자가 실제로 존재하지 않는 파일에 저장할 것 같다 등… 얼마든지 예외 처리가 가능함.
  • if문 사용 등으로 대응이 대체로 쉬움
  1. 예측 불가능한 예외
  • 예) 매우 많은 파일을 처리할 때
  • 인터프리터가 자동으로 예외라고 사용자에게 알려줌

프로그램도 일종의 제품이므로 예외 처리는 중요함. 제품의 완성도를 높이는 차원에서 예외 처리는 매우 중요한 개념임.

3) 예외 처리 구문

  1. try-except문
  • try문에 예외 발생이 예상되는 코드, except문에 예외 발생 시 대응하는 코드를 작성한다.
for i in range(10):
    try:
        print(10 / i)
    except ZeroDivisionError:
        print("Not divided by 0")

# 출력결과
Not divided by 0
10.0
5.0
3.3333333333333335
2.5
2.0
1.6666666666666667
1.4285714285714286
1.25
1.1111111111111112
  1. try-except-else문
  • if-else문과 비슷함. 해당 예외가 발생하지 않는 경우 수행할 코드를 else문에 작성하면 됨.

try문에 예외 발생 가능 코드, except 예외 타입 뒤에 예외 발생 시 실행되는 코드, else문에 예외가 발생하지 않을 때 실행되는 코드를 작성

for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        print("Not divided by 0")
    else:
        print(10 / i)

# 출력결과
Not divided by 0
10.0
5.0
3.3333333333333335
2.5
2.0
1.6666666666666667
1.4285714285714286
1.25
1.1111111111111112

에러가 발생하지 않는 경우의 수행문을 정의해 놓으면 에러가 발생하지 않는 경우에도 일어날 일을 사용자가 정확히 예측할 수 있음

  1. try-except-finally문
  • finally문 : try-except문 안에 있는 수행 코드가 아무런 문제없이 종료되었을 경우 최종으로 호출하는 코드. for문에서 사용하는 finally문과 용도가 비슷하다고 생각하면 됨
  • try문 뒤에 예외 발생 가능 코드, except 예외 타입 뒤 예외 발생시 실행되는 코드, finally문 뒤에 예외 발생 여부와 상관없이 실행되는 코드를 작성
try:
    for i in range(1, 10):
        result = 10 // i
        print(result)
except ZeroDivisionError:
    print("Not divided by 0")
finally:
    print("종료되었다.")

# 출력결과
10
5
3
2
2
1
1
1
1
종료되었다.
  1. raise문
  • 필요할 때 예외를 발생시키는 코드
  • raise 예외 타입(예외 정보)
while True:
    value = input("변환할 정수값을 입력해 주세요: ")
    for digit in value:
        if digit not in "0123456789":
            raise ValueError("숫자값을 입력하지 않았습니다.")
    print("정수값으로 변환된 숫자-", int(value))

# 출력결과
변환할 정수값을 입력해 주세요: 10
정수값으로 변환된 숫자- 10
변환할 정수값을 입력해 주세요: ab
Traceback (most recent call last):
  File "C:\\Users\\hahnp\\PycharmProjects\\study_only\\dsob_week10\\raise.py", line 5, in <module>
    raise ValueError("숫자값을 입력하지 않았습니다.")
ValueError: 숫자값을 입력하지 않았습니다.

while True문으로 반복문이 계속 돌아가는 상태에서 사용자에게 입력을 받는 코드. 사용자가 입력한 값이 숫자가 아닌 경우 숫자값을 입력하지 않았다고 출력하며 프로그램을 종료함.

  1. assert문
  • 미리 알아야 할 예외 정보가 조건을 만족하지 않을 경우 예외를 발생시킴
  • assert 예외 조건
def get_binary_number(decimal_number):
    assert isinstance(decimal_number, int)
    return bin(decimal_number)
print(get_binary_number(10))
print(get_binary_number("10"))

# 출력결과
0b1010
Traceback (most recent call last):
  File "C:\\Users\\hahnp\\PycharmProjects\\study_only\\dsob_week10\\assert.py", line 5, in <module>
    print(get_binary_number("10"))
  File "C:\\Users\\hahnp\\PycharmProjects\\study_only\\dsob_week10\\assert.py", line 2, in get_binary_number
    assert isinstance(decimal_number, int)
AssertionError

assert문은 코드를 작성할 때 잘못된 입력 여부를 사전에 확인하여 나중에 필요없는 연산을 막아주고, 결국 다른 사람이 만든 코드를 사용하는 데 좋은 가이드가 된다.

2. 파일 다루기

1) 파일의 개념

파일은 컴퓨터를 실행할 때 가장 기본이 되는 단위이다. 프로그램을 실행하는 것은 늘 파일을 실행하는 것이다.

2) 파일의 종류

  1. 바이너리 파일(binary file)
  • 컴퓨터만 이해할 수 있는 이진 정보로 저장된 파일
  • 비트 형태로 저장되어 메조장으로 열면 내용이 보이지 않거나 내용 확인이 되지 않는 파일

   2. 텍스트 파일(text file)

  • 사람이 이해할 수 있는 문자열로 저장된 파일로, 메모장으로 내용 확인 가능함
  • 텍스트 파일도 컴퓨터가 처리하기 위해 바이너리 형태로 저장된 파일임.
  • 텍스트 파일은 컴퓨터가 이해할 수 있는 형태로 변경하여 저장되는데, 변경하는 기준을 아스키코드나 유니코드로 하고 표준에 따라 컴퓨터가 이애할 수 있도록 바꾼다.

3) 파일 읽기

  • open( ) 함수 사용
  • 파일 여는 모드에는 읽기 모드, 쓰기 모드, 추가 모드 등이 있음
  • r : 읽기 모드 (파일을 읽기만 할 때 사용)
  • w : 쓰기 모드 (파일에 내용을 쓸 때 사용)
  • a : 추가 모드 (파일의 마지막에 새로운 내용을 추가할 때 사용)

1. 파일 읽기

f = open("dream.txt", "r")
contents = f.read()
print(contents)
f.close()

# 출력결과
I have a dream a song to sing
to help me cope with anything
if you see the wonder of a fairy tale
you can take the future even
if you fail I believe in angels
something good in everything

open( ) 함수와 read( ) 함수를 통해 텍스트를 출력함

2. with문과 함께 사용하기

with open("dream.txt", "r") as my_file:
    contents = my_file.read()
    print(type(contents), contents)

# 출력결과
<class 'str'> I have a dream a song to sing
to help me cope with anything
if you see the wonder of a fairy tale
you can take the future even
if you fail I believe in angels
something good in everything

close( ) 함수를 명시적으로 쓰지 않아도 파일의 사용을 종료할 수 있음

3. 한 줄씩 읽어 리스트형으로 반환하기

with open("dream.txt", "r") as my_file:
    content_list = my_file.readlines()
    print(type(content_list))
    print(content_list)

# 출력결과
<class 'list'>
['I have a dream a song to sing\\n', 'to help me cope with anything\\n', 'if you see the wonder of a fairy tale\\n', 'you can take the future even\\n', 'if you fail I believe in angels\\n', 'something good in everything']

readlines( ) 함수를 사용하여 한 줄씩 내용을 읽어와 문자열 형태로 저장함.

4. 실행할 때마다 한 줄씩 읽어오기

with open("dream.txt", "r") as my_file:
    i = 0
    while 1:
        line = my_file.readline()
        if not line:
            break
        print(str(i)+"==="+ line.replace("\\n",""))  # 한 줄씩 값 출
        i = i + 1

# 출력결과
0===I have a dream a song to sing
1===to help me cope with anything
2===if you see the wonder of a fairy tale
3===you can take the future even
4===if you fail I believe in angels
5===something good in everything

5. 파일에 저장된 글자의 통계 정보 출력하기

with open("dream.txt", "r") as my_file:
    contents = my_file.read()
    word_list = contents.split(" ")
    line_list = contents.split("\\n")

print("총 글자의 수:", len(contents))
print("총 단어의 수:", len(word_list))
print("총 줄의 수:", len(line_list))

# 출력결과
총 글자의 수: 187
총 단어의 수: 35
총 줄의 수: 6

split( ) 함수와 len( ) 함수를 함께 사용

4) 파일 쓰기

인코딩 : 텍스트 파일을 저장하기 위해서는 저장 시 사용하는 표준을 지정해야 하는데, 이를 인코딩이라고 함.

인코딩 옵션으로 인코딩 표준을 지정할 수 있으며 일반적으로 utf8을 많이 사용

5) pickle 모듈

  • 영속화 : 파이썬 프로그로그램을 실행할 때 생성되는 여러 변수와 객체는 순간적으로 메모리에 로딩되었다가 프로그램이 종료되면 사라진다. 하지만 때로는 이렇게 사용되는 객체를 저장시켜 놓고 필요 시 다시 불러야 하는 경우가 있는데 이 경우를 영속화라고 함.
  • pickle 모듈 사용을 위해 호출 후 객체를 저장할 수 있는 파일을 열고 저장하고자 하는 객체를 dump하면 됨.
  • dump( ) 함수에서는 저장할 객체, 저장될 파일 객체를 차례대로 인수로 넣으면 해당 객체가 해당 파일에 저장됨