또, 코드가 점점 커지면, 코드를 하나의 파일에 담기 어려워지게 됩니다. 그럴 때는 코드를 여러 개의 파일로 나누어 놓고, 필요한 내용들을 불러와서 사용하게 되는데, ‘불러와서 사용할 수 있게 되어 있는 형태’를 모듈이라고 합니다.
초기에는 여러분이 직접 모듈을 만들기보다는 다른 사람들이 만들어놓은 모듈을 사용할 일이 더 많이 있을겁니다.
파이썬을 처음 시작하면, 기본적으로 할 수 있는 것들이 다소 제한되어 있습니다. 좀더 본격적인 분석 작업들을 수행하기 위해서는, 다양한 도구(모듈)들을 추가로 불러들여 사용해야 합니다.
모듈을 사용하기 위해서는 우선 모듈을 불러들여서 메모리상에 적재해야 합니다.
모듈을 적재하려면 import 구문을 사용합니다. import된 모듈은 . 을 통해서 그 안에 포함된 함수, 변수, 클래스 등에 접근할 수 있습니다.
import os
print(os.listdir('.'))['.git', '.gitignore', '.mypy_cache', 'LICENSE.md', 'README.org', 'assets', 'beautifulsoup.org', 'excel-1.org', 'excel-2.org', 'installation.org', 'jupyter-install.org', 'kevin.org', 'language-basic-1.org', 'language-basic-2.org', 'language-basic-3.org', 'language-basic-4.org', 'obipy-resources', 'outputs', 'pandas.org', 'proficiency.org', 'python-overview.org', 'qna.org', 'refactoring.org', 'regex.org', 'testing.org']
또는 from ... import 구문을 사용하여 특정 모듈 내의 원하는 대상을 모듈 접두어 없이 곧바로 참조할 수 있습니다.
from os import listdir
print(listdir('.'))['.git', '.gitignore', '.mypy_cache', 'LICENSE.md', 'README.org', 'assets', 'beautifulsoup.org', 'excel-1.org', 'excel-2.org', 'installation.org', 'jupyter-install.org', 'kevin.org', 'language-basic-1.org', 'language-basic-2.org', 'language-basic-3.org', 'language-basic-4.org', 'obipy-resources', 'outputs', 'pandas.org', 'proficiency.org', 'python-overview.org', 'qna.org', 'refactoring.org', 'regex.org', 'testing.org']
앞서 import 구문만을 사용했을 때는, os 라는 모듈 안에 있는 listdir() 함수에 접근하기 위해 os.listdir() 과 같이 전체 경로를 적어야 했지만, from .. import .. 구문을 사용하여 listdir() 함수를 명시적으로 불러들인 경우에는, listdir() 과 같이 곧바로 접근할 수 있습니다.
모듈의 이름이 길거나 겹치는 경우에는 별칭으로 접근하도록 지정할 수 있습니다.
from matplotlib import pyplot as plt
plt.plot([1, 2, 3, 4, 5])
plt.show()
파이썬 표준 모듈 라이브러리도 참고하시면, 파이썬이 기본적으로 내장하고 있는 기능들을 살펴볼 수 있습니다.
(모듈 설치하기 참고내용)
이번에는 예외 처리에 대해 알아보겠습니다.
프로그램을 의도대로 작성하다보면, 의도와 다르게 동작하는 경우를 고려해야 할 때가 있습니다. 이를테면 하위 디렉토리에 파일을 생성하려고 했는데, 그 디렉토리가 아직 존재하지 않는 경우, 아니면 웹에서 정보를 가져오도록 했는데 인터넷 연결이 끊어진 경우 등이 있겠죠. 이런 경우에, 프로그램이 그 의도하지 않은 상황, 즉 예외 상황에 대해서 어떻게 동작해야 하는지 일러주어야 합니다.
a_list = [1, 2, 3, 4, 5]
a_list[5] # IndexError가 발생. 참조는 0부터 시작하기 때문에, '5'를 참조하기 위해서는 4를 지정해야 함.Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
a_dict = {'Tom': 32, 'Chris': 20}
a_dict['Mary'] # KeyError가 발생. a_dict에 Mary는 존재하지 않음.Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Mary'
예외가 발생한 경우에는, return 여부와는 상관 없이 즉시 상위 호출 개체로 예외가 전파됩니다. 도중에 예외를 잡아 처리한 경우에는 전파가 중단됩니다. 아무 곳에서도 예외를 잡아 처리하지 않은 경우에는 위의 출력 결과에서 보듯이 예외이름: 구체적인 메세지 과 같은 내용이 출력됩니다.
아마도 여러분이 직접 예외 상황을 만들 일보다는 기본 라이브러리나 외부 라이브러리에서 발생하는 예외 상황을 처리해야 할 경우가 많을 것입니다. 발생할 예외를 처리할 구문을 지정하기 위해서는 try... except... 구문을 사용합니다.
a_dict = {'Tom': 32, 'Chris': 20}
try:
print(a_dict['Mary'])
except KeyError:
a_dict['Mary'] = 10
print(a_dict['Mary'])10
예외의 구체적인 내용이 필요할 때는 try... except ... as ... 구문을 사용합니다.
a_dict = {'Tom': 32, 'Chris': 20}
try:
print(a_dict['Mary'])
except KeyError as ex:
print('Missing key:', ex.args[0])
a_dict['Mary'] = 10
print(a_dict['Mary'])Missing key: Mary 10
except 로 식별할 수 있는 예외/에러의 종류에는 여러 가지가 있습니다.
IndexError:list의 참조 범위를 벗어난 경우KeyError:dict에 존재하지 않는 키를 참조한 경우IOError: 파일이나 네트워크 등에 관련된 오류NameError: 변수 이름이 존재하지 않는 경우TypeError: 타입이 잘못 지정된 경우
이 외에도 다양한 예외 종류가 있습니다. 그리고 이렇게 내장(built-in)되어 있는 예외는 별다른 과정 없이 곧바로 사용할 수 있습니다.
반면에 예외는 프로그래머가 새롭게 정의해서 사용할 수도 있습니다.
class MyException(Exception):
pass
raise MyException()예외는 클래스를 사용해서 정의됩니다. 따라서 프로그램을 작성하면서, 잡기를 원하는 예외가 있다면, 해당 예외가 정의된 클래스를 import 해서 사용해야 합니다.
프로그램을 작성하다 보면 오류 상황에 굉장히 많이 맞닥뜨리게 됩니다. 이 때, 오류에 당황하지 않고 문제 지점을 찾아내고 원인을 파악해내는 것이 매우 중요합니다.
존재하지 않는 디렉토리에 파일을 쓰려고 하면, 아래와 같은 오류 메세지가 발생합니다.
import os
def read():
with open(os.path.join('nodirectory', 'testoutput.txt'), 'w') as fout:
fout.write('hello')
read()Traceback (most recent call last): File "exc.py", line 7, in <module> File "exc.py", line 4, in read FileNotFoundError: [Errno 2] No such file or directory: 'nodirectory/testoutput.txt'
오류 메세지는 크게 Traceback과 에러 메세지로 구분할 수 있습니다. 위에서 Traceback (most recent call last) 이라고 표현된 아랫줄부터, FileNotFoundError 라고 예외의 이름이 표시된 줄 바로 윗까지가 traceback 정보입니다. traceback 정보는 함수들이 호출된 경로를 나타냅니다. 어떤 실행 과정을 거쳤으며 최종적으로 코드의 어느 지점에서 오류가 발생했는지, 그 위치를 파악할 수 있습니다.
위의 오류에서 보면, 가장 처음 실행이 시작된 곳은 7행, read() 부분입니다. 그리고 read() 함수에서 4행의 open() 함수를 실행하는 도중에 오류가 발생한 것을 알 수 있습니다. 그리고 마지막 줄을 보면 발생한 오류는 FileNotFoundError 입니다.
예외 메세지를 봐도 어떤 상황이며 왜 오류가 발생했는지 알기 어렵다면, 예외 메세지 자체를 검색엔진에서 검색해보는 것도 좋은 습관입니다. 위의 경우에는 FileNotFoundError: [Errno 2] No such file or directory 를 통째로 검색해볼 수 있습니다.
(예전 버전, 형태소 분석기와 의미망을 사용한 연습문제)
(예전 버전, 형태소 분석기와 태그 클라우드를 사용한 연습문제)
