[006일차] 예외 처리와 텍스트파일 다루기 / 파이썬 중급

이연희·2023년 8월 11일

INDEX
1. 예외 처리
(1) 예외란?
(2) 구문을 이용한 예외 처리
(3) 클래스를 이용한 예외 처리
2. 텍스트파일 다루기
(1) 파일 쓰기
(2) 파일 읽기
(3) 파일 여닫기

1. 예외 처리

(1) 예외란?

예외는 코드에 문법적인 오류는 없으나, 실행 중 발생하는 문제를 말한다. ZeroDivisionError를 예로 들 수 있다.

n1 = 10
n2 = 0

print(f'{n1} / {n2} = {n1 / n2}')

이런 코드를 작성할 때 코드에는 전혀 문제가 없으나, 분모가 0이 되었을 때 나눗셈을 할 수 없는 문제에 맞딱뜨리게 되므로 프로그램 실행에 제약이 걸리게 된다.

그러므로 이러한 예외가 발생할 수 있을 경우를 걸러내야 실행이 매끄러워진다. 이를 예외를 처리한다고 하는데, try~except구문을 응용하는 방법과, 클래스를 이용한 예외처리가 있다.

(2) 구문을 이용한 예외 처리

  • try~except 구문

예외가 발생할 우려가 있는 코드를 구문으로 감싸서 처리하는데, 예외가 발생할 경우의 대처를 except 뒤의 실행문에 작성해준다.

예를 들어, 사용자로부터 5개의 숫자를 받아, 리스트를 작성하려고 한다. 정수가 입력되지 않으면 예외처리를 하는 코드를 작성해보자.

nums = []

n = 1
while n < 6:

    try:
        num = int(input('input number: '))
    except:
        print('예외 발생! 정수를 입력하세요')
        continue

    nums.append(num)	#num의 데이터를 취합
    n += 1

print(f'nums: {nums}')

이런식으로 만약 num에 정수형 자료가 입력되지 않으면 except 구문이 실행되어 '예외 발생! 정수를 입력하세요' 라는 문구가 출력된다.

이런식으로 예외가 발생하면 문구 출력과 함께 while문을 다시 실행한다.

  • try ~ except ~ else

else구문을 추가해서 예외가 발생하지 않았을 경우를 처리하는 부분도 세부적으로 작성할 수 있다.
위의 예시를 이용해서, 정수 중에서도 짝수들만 취합해서 리스트를 작성하는 코드를 작성해보자.

nums = []
n = 1

while n < 6:

    try:
        num = int(input('숫자 입력: '))
    except:
        print('예외 발생! 정수를 입력하세요.')
        continue
    else:
        if num % 2 == 0:
            nums.append(num)
            n += 1
        else:
            print('홀수 입니다.', end='')
            print('다시 입력하세요.')
            continue

print(f'nums: {nums}')

이런식으로, num에서 예외가 발생할 경우는 정수가 아닌 자료형이 입력되었을 경우이므로 이런 경우는 try~except으로 처리해준다. else 구문에는 세부적으로 num이 정수이지만 홀수의 경우의 제약을 걸어줄 수도 있는 것이다.

  • finally

뿐만 아니라, 예외가 발생될지 말지의 경우와 상관없이 항상 출력될 수 있는 부분은 finally로 처리해서 한꺼번에 작성할 수도 있다.

try:
    inputData = input('input number: ')
    numInt = int(inputData)
except:
    print('Exception raise!!')
    print('Not number!')
else:
    if numInt % 2 == 0:
        print('even number!')
    else:
        print('odd number!')
finally:
    print(f'inputData: {inputData}')

이런식으로 numInt의 정수가 짝수든 홀수든, 혹은 정수형이 아니든 모든 데이터를 출력하고 싶다면, finally로 코드를 작성할 수 있는 것이다.



(3) 클래스를 이용한 예외 처리

  • Exception 클래스

파이썬에 내장되어 있는 Exception클래스를 이용해서 예외를 처리할 수 있다.

num1 = int(input('숫자1 입력: '))
num2 = int(input('숫자2 입력: '))

try:
    print(f'num1/num2 = {num1/num2}')
except Exception as e:
    print('0으로 나눌 수 없습니다.')
    print(f'exception: {e}')

이런식으로 except구문에 Exception클래스를 기입해서 어떤 예외가 발생했는지 출력할 수 있다.

  • 사용자 예외 클래스

사용자가 Exception클래스를 상속한 다음 직접 클래스를 만들어서 사용할 수도 있다.

class NotUseZeroException(Exception):
    def __init__(self,n):
        super().__init__(f'{n}은 사용 불가능.')

이런식으로 이전 시간에 배운 클래스 상속을 이용해서 직접 예외가 발생했을 경우의 출력 문구를 작성해준 다음

def divCalculator(n1, n2):

    if n2 == 0:
        raise NotUseZeroException(n2)
    else:
        print(f'{n1} / {n2} = {n1 / n2}')

raise 구문을 이용해서 직접 만든 클래스를 작성해주면, 예외 처리를 할 수 있다.

2. 텍스트파일 다루기

파이썬을 이용해서 텍스트 파일을 특정 파일주소에 저장할 수도 있고, 저장되어 있는 텍스트 파일을 읽을 수도 있다.

(1) 파일 쓰기

  • write()
file = open('C:/pythonTxt/test.txt','w') 

strCnt = file.write('Hello python!')
print(f'strCnt: {strCnt}')

file.close()

open함수를 이용해서 저장된 파일의 주소를 입력해준 다음, 'w'을 옵션으로 지정해서 쓰기 모드로 변수에 지정해준다.
다음 write()함수를 이용해서 원하는 문구를 텍스트 파일에 작성할 수 있다. 파일 쓰기를 마친다면 close()함수로 파일 실행을 해제해야 한다.


이런 식으로 코드 결과를 확인할 수 있다.

  • writelines()

writelines() 함수를 사용하면, 여러 개의 자료들을 한꺼번에 텍스트 파일에 작성할 수 있다.

languages = ['c/c++', 'java', 'c#', 'python', 'javaScript']

file = open('C:/pythonTxt/writelines.txt', 'w')
file.writelines(item + '\n'  for item in languages)
file.close()

리스트 자료를 writelines()함수를 이용해서 텍스트 파일을 만들 때, '\n'을 이용해서 데이터들을 개행해줘야 깔끔하게 파일을 작성할 수 있다.

(2) 파일 읽기

  • read()

반대로 저장된 텍스트 파일을 파이썬 결과창에 출력할 수도 있다. 앞에서 저장한 'test.txt'파일을 다시 파이썬에서 읽으려면 open()함수에서 파일 주소뒤의 옵션은 'r'로 달아서 읽기 모드로 변경한 다음 문구를 불러오면 된다.

file = open('C:/pythonTxt/test.txt', 'r') 

str = file.read()
print(f'str: {str}')

file.close()

  • readlines()

다량의 데이터를 읽어서 리스트 형태로 반환하는 함수이다.
앞에서 작성한 'writelines.txt'파일을 다시 리스트 함수로 불러오면

file = open('C:/pythonTxt/writelines.txt','r')
list = file.readlines()

print(f'list: {list}')
print(f'list type: {type(list)}')

이런 코드를 작성할 수 있다.

  • readline()

한 행만 읽어서 문자열로 반환하는 함수이다.

file = open('C:/pythonTxt/writelines.txt','r')
list2 = file.readline()

while list2 !='':
     print(f'list2: {list2}',end='')
     list2 = file.readline()


이런 식으로 while문을 이용해서 데이터가 없을 때까지 다음 줄의 데이터를 읽지 않으면 한 줄만 읽은 다음 데이터 출력을 멈추게 된다.

(3) 파일 여닫기

  • 파일 열기

앞에서 파일을 쓰거나 읽을 때 open()함수에, 파일 주소를 입력한 다음 파일모드를 달아주었다.

open( 'C:/', '파일모드')

이때 파일모드에는 다양한 목적으로 구분해줄 수 있다.

'w': 파일 쓰기(파일 덮어쓰기 가능)
'a': 파일 쓰기(파일이 있다면 덧붙임)
'x': 파일 쓰기(기존 파일 있으면 에러 발생)
'r': 파일 읽기(파일 없으면 에러 발생)

  • 파일 닫기

앞에서 파일을 쓰거나 읽을 때, 마무리로 close()함수를 이용해서 파일 실행을 해제해야 했다.
하지만 with~as 구문을 이용하면 cloes()함수로 마무리 하지 않더라도 구문이 끝났을 때, 자동적으로 실행을 해제시킨다.

file = open('C:/pythonTxt/test.txt','w') 

strCnt = file.write('Hello python!')
print(f'strCnt: {strCnt}')

file.close()

앞에서 이런식으로 작성해서 저장했던 텍스트 파일을

with open('C:/pythonTxt/test.txt','w') as f:
	f.write('Hello python!')

이렇게 두 줄짜리 코드로 간편하게 작성할 수 있다.

반대로 작성한 파일을 읽을 때에는

with open('C:/pythonTxt/test.txt','r') as f:
	print(f.read())

이런 식으로 파일 모드를 변경하고 실행구문을 변경만 해줘서 간단하게 작성할 수 있다.

profile
안녕하세요, 데이터 공부를 하고 있습니다.

0개의 댓글