Language/Python [python] 모듈/예외 처리/파일 입출력
  • 728x90
    반응형

     

    Python 문법 기초


     

    목차

       

      모듈 사용하기

      📌 현재 파이썬 3.0 버전에서는 대략 200개가 넘는 모듈을 지원한다.

      • 문자열(string), 날짜(date), 시간(time), 십진법(decimal), 랜덤(random)
      • 파일(file), os, sqlite3, sys, xml, email, http 등등

       

      📌  모듈을 사용하는 이유

      • 코드의 재 사용성
      • 코드를 이름공간으로 구분하고 관리 할 수 있음.
      • - 복잡하고 어려운 기능을 포함하는 프로그램을 간단하게 만들 수 있다.

       

      모듈 import

      import : 모듈을 현재 이름공간으로 가져오는 역할

       

       

      math 모듈은 삼각함수, 제곱근, 로그함수 등 수학과 관련된 기능이 들어 있는 내장 모듈.

      dir() 함수를 이용해 모듈에 어떠한 함수 혹은 데이터가 들어 있는지 알 수 있다.

       

       

       

      모듈 만들기

      • 사용자가 직접 모듈을 만들 수 있다.
      • 큰 프로젝트의 경우 모듈 단위로 일을 진행 하기도 함.
      • 모듈은 일반적으로 <모듈이름>.py 로 지정한다.

       

      simpleset 모듈 만들기

      텍스트 에디터를 이용해 교집함, 차집합, 합집합 함수를 만들어 본다.

      simpleset.py 이름으로 저장하고 simpleset.py를 파이썬 라이브러리 디렉터리에 옮긴다.

      import 명령을 이용해 simplest 모듈을 가지고 온다.

       

      >>> import simpleset

       

      합집합 구하기

      >>> setA = [1, 3, 7, 10]

      >>> setB = [2, 3, 4, 9]

      >>> simpleset.union(setA, setB)

      [1, 3, 7, 10, 2, 4, 9]

       

       

      모듈의 경로

      📌 모듈을 임포트 했을 때 모듈의 위치를 검색하는 경로.

      • sys.path 에 저장되어 있는 디렉토리를 검색한다.

       

      모듈의 경로 밖의 모듈은 임포트 할 수 없음.

       

      모듈 경로 탐색 순서

      • 프로그램이 실행된 디렉터리
      • PYTHONPATH 환경 변수에 등록된 위치
      • 표준 라이브러리 디렉터리

       

      모듈 임포트

      📌 모듈 안의 어트리뷰트(함수, 데이터) 들을 사용하려면 임포트를 해야 한다.

      • Import 구문은 어디에서나 사용 가능 하다.
      • 함수, 제어문 내부에서도 import를 할 수 있다.

       

      Import <모듈이름>

      • 기본적인 임포트 방법
      • 모듈. 이름 형식으로 모듈 안의 데이터나 함수를 사용 할 수 있다.
      • 모듈을 임포트 하는 방법은 import 모듈 이름 방법 이외에도 다른 방법이 있다.

       

      from <모듈> import <어트리뷰트>

      >>> from sdimplset import union

      >>> union([1, 2, 3], [3], [3, 4])

      [1, 2, 3, 4]

       

      from <모듈> import *

      import <모듈> as <별칭>

       

      • <모듈> 이름을 <별칭>으로 변경하여 임포트 한다.

       

      임포트를 할 때, 해당 모듈의 바이트 코드가 있으면 이를 임포트한다.

      모듈을 임포트 하면 해당 모듈의 코드가 실행된다.

      모듈이 임포트되면 메모리에 모듈 코드가 로딩되면 프로그램이나 파이썬 인터프리터가 끝나기 전까지 변경되지 않는다.

       

       

      바이트 코드

      📌 일종의 중간 파일

      • 모듈의 임포트를 빠르게 해주는 역할
      • 바이트 코드가 이미 있으면: 모듈을 인터프리팅(Interpreting)하지 않고 바로 바이트 코드 로딩
      • 바이트 코드가 없으면: 모듈을 인터프리팅 해서 바이트 코드를 생성
      • 바이트 코드가 생성된 모습

       

       

       

      모듈이 메모리에 로딩 될 때

      모듈의 코드가 실행 됨

       

      처음 임포트 할 때 "print" 구문이 실행된다.

      한번 메모리에 로딩된 모듈은 끝나기 전 까지 변하지 않는다.

       

      모듈이 직접 실행 혹은 다른 곳에서 임포트 되었는지를 구분 해 줄 수 있는 __name__ 어트리뷰트

      • 모듈이 임포트 되었을 때 __name__은 모듈 자기 자신의 이름
      • 모듈이 직접 실행 되었을 때 __name__은 "__main__"

       

       

       

      패키지

      📌 모듈의 모음

      • 파이썬의 모듈 이름공간을 구조화 하는 한 방법
      • 파이썬 내장 라이브러리 중 XML 패키지의 디렉터리 구조

       

       

       

      예외 (Exception)

      📌 프로그램의 제어 흐름을 조정하기 위해 사용하는 이벤트

      • 처리를 하지 않는 예외에 대하여 자동으로 에러(Error)가 발생하고 프로그램을 종료

      • 처리되지 않은 예외(Unhandled Exception)
        1. '0'으로 나누는 경우
        2. 원격에 있는 데이터 베이스 접속시 연결되지 않는 경우
        3. 파일을 열었는데 사용자에 의해서 삭제된 경우

       

      구문 에러

      • 오타, 들여쓰기의 실수로 발생.
      • 인터프리터에서 에러가 의심되는 부분을 개발자에게 알려줌.

       

       

       

      예외의 몇가지 종류

      • NameError
        • 선언하지 않은 변수 'a'에 접근

       

      • ZeroDivisionError
        • '0'으로 나눔

       

      • IndexError
        • 리스트의 접근 가능한 인덱스를 넘음

       

      • TypeError
        • 지원하지 않는 연산(정수를 문자열로 나눔)

       

       

      내장예외 클래스 계층 구조

      📌 내장 예외는 exceptions 모듈에 미리 정의

      • 프로그램 동작 중 자동적으로 발생
      • 개발자가 명시적으로 예외 발생도 가능

       

      주요 내장 예외

       

      클래스 이름 내용
      Exception 모든 내장 예외의 기본 클래스
      - 사용자 정의 예외를 작성시 활용
      ArithmeticError 수치 연산 예외의 기본 클래스
      LookupError 시퀀스 관련 예외의 기본 클래스
      EnvironmentError 파이썬 외부 에러의 기본 클래스

       

       

      예외 처리

      📌 try 구문

       try:
      <예외 발생가능성이 있는 문장>
      except <예외 종류> :
      <예외 처리 문장>
      except(예외 1, 예외 2):
      <예외 처리 문장>
      except 예외 as 인자:
      <예외 처리 문장>
      else:
      <예외가 발생하지 않은 경우, 수행할 문장>
      Finally:
      <예외 발생 유무에 상관없이 try블록 이후 수행할 문장>

       

       

      🔔 try ~ except 예제

       

      🔔 예외 처리 예제

       

      🔔 예외 처리 예제

       

      🔔 예외 처리 예제

       

      🔔 예외 처리 예제

       

      🔔 예외 처리 예제

       

      try ~ finally

      try:
      <예외 발생 가능성이 있는 문장>
      finally:
      <예외와 관계없이 항상 수행되어야 할 문장>

      • 위와 같은 구조인 경우, finally는 생략 불가

       

      🔔  예제

       

       

      raise 구문

       

      명시적으로 예외 발생

       

      raise 구문 형식

      • raise [Exception]
      • raise [Exception(data)]
      • raise

       

       

       

      사용자 정의 예외

      내장 예외만으로 부족한 경우, 개발자가 직접 예외를 정의하여 사용 가능

      • Exception 클래스나 그 하위 클래스를 상속받아서 구현
      • 생성자에 클래스 멤버 변수를 이용하여 인자를 에러 처리부로 전달

       

      🔔 예제

       

       

       

       

      assert 구문

      표현식

      • Assert <조건식>, <관련 데이터>

       

      인자로 받은 조건식이 거짓 경우, AssertionError가 발생

       

      개발과정에서 디버깅, 제약 사항 설정등으로 사용

       

      __debug__ 가 True인 경우만 assert 구문 활성화

      • 명령 프롬프트 에서 최적화 옵션 (–O)을 설정하면 __debug__는 False로 설정됨
      • 다음 코드와 동일

       

      🔔 예제

       

       

       

      출력

      화면으로 출력할 때는 print() 함수를 사용한다.

       

      파이썬 버전 2.x 때는 print가 함수가 아니었지만, 3.0 에서는 함수로 바뀌었다. 즉, 다음과 같이 함수처럼 괄호 안에 출력할 인자를 적으면 된다.

       

       

      print 함수의 입력인자로 다음과 같이 구분자(sep), 끝라인(end), 출력(file)을 지정해 줄 수 있다. 아래 예제와 같이 file을 이용해서 출력을 표준오류(standard error)로 변경하거나 파일로 바꿀 수도 있다.

       

       

       

      포맷팅 (formatting)

      format()메소드를 사용하면 문자열을 그 이상으로 자유롭게 다룰 수 가 있다.

      문자열 내에서 어떤 값이 들어가길 원하는 곳은 { }로 표시를 한다.

      { }안의 값들은 숫자로 표현할 수 있으며, format 인자들의 인덱스를 사용한다.

      아래 예제를 보면, {0}는 첫 번쨰 인자인 "apple"을 나타내고 {1}은 두번쨰 인자인 "red"를 나타낸다.

       

       

      { }안의 값을 지정할 때는 다음과 같이 format의 인자로 키(key)와 값(value) 을 주어 위와 동일한 결과를 얻을 수 있다.

       

       

      dictionary를 입력으로 받는 경우.

       

       

      **기호를 사용하면 dictionary를 입력으로 받는 것으로 판단하며, index는 생략할 수 있다.

       

       

      !기호를 사용해서 문자열 변환을 사용할 수 있다.

      !s , !r , !a는 각각 str(), repr(), asci()를 실행한 결과와 동일하다.

       

       

      ":"기호를 이용하여 보다 정교하게 정렬, 폭, 부호, 공백처리, 소수점 타입 등을 지정할 수 있다.

       

       

      "{0"까지는 첫번쨰 인자인 '10'을 표시하라는 뜻이다. ":"이후의 기로인 "$"는 공백을 채우는 문자를 "$"로 채우라는 의미이며, ">"는 오른쪽 정렬을, "5"는 전체 자리수가 5자리라는 것을 나타낸다.

       

      정렬에 사용되는 기호는 ">", "<", "^", "="이 있다. <">"는 오른쪽 기준, "<"는 왼쪽 기준, " ^"는 가운데 기준, "="가 사용되면 공백문자들 앞에 부호가 표시된다. 사용되지 않으면 공백문자들 뒤, 즉 숫자 바로 앞에 부호가 표시된다.

       

      부호를 나타내는 기호는 "+" , "-" , " "가 있다. "+"는 플러스 부호를 나타내라는 뜻이며, "-"는 마이너스 값만 마이너스 부호를 나타내라는 것을 의미하며, " " 는 마이너스 값에는 마이너스 부호를 나타내고 플러스일 떄는 공백을 표시하라는 뜻이다.

       

      진수를 바꿔서 출력할 수 도있다. "b"는 이진수를, "d"는 십진수를, "x"는 1 6진수를, "o"는 8진수를 나타내며 "c"는 문자열을 출력한다.

       

       

      또한 "#"를 사용하면 #x는 16진수 #o는 8진수, #b는 2진수로 표시된다.

       

       

      정수 이외에 실수에 대한 변환도 제공되며, "e"는 지수표현을, "f"는 일반적인 실수 표현을, "%"는 퍼센트 표현을 의미한다.

       

       

      실수에서는 다음과 같이 소수점 몇 번째 자리까지 표현할 것인지를 지정할 수 있다.

      아래 예제에서는 소수점 3번째 자리까지만 출력되는 것을 확인할 수 있다.

       

       

      입력

      사용자로부터 입력은 다음과 같이 input() 함수를 이용해서 받을 수 있다.

      input의 입력인자로는 화면에 출력할 프롬프트(prompt)를 줄 수 있으며, 생략 가능하며, 결과값으로는 문자열 객체를 반환한다.

       

       

       

      파일 입출력

      📌 파일로의 입출력은 앞에서 본 바와 같이 print()함수의 file입력인자를 이용할 수 도 있지만, 파일 입출력 제어를 보다 세밀하게 하기 위해서는 open()함수를 통해서 파일을 연 후 파일 전용 함수들을 이용해서 작업하는 것이 일반적이다.

       

      • r : 읽기 모드 (default)
      • w: 쓰기 모드
      • a: 쓰기 + 이어쓰기 모드
      • +: 읽기 + 쓰기 모드
      • b: 바이너리 모드
      • t: 텍스트 모드(default)

       

      📌  파일로부터 읽고 쓰기 위해서 파일로부터 모든 데이터를 읽는 read()함수와 문자열을 쓰는 write()함수가 제공된다. 또한 파일을 열고 할 일을 모두 완료했을 경우 파일객체를 닫아주는 close()함수가 있다.

       

      위 예제에서 파일이 제대로 쓰였는지 읽어본 결과

       

      📌 텍스트 모드에서는 일반 문자열과 같이 encoding이 적용되기 때문에, 바이너리 데이터(binary data) 를 다룰 때에는 오류가 발생하게 된다. 그러므로 바이너리 데이터를 다룰 때에는 반드시 바이너리 모드를 사용해야 한다.

       

      파일 입출력 관련 함수들

      • readline()함수는 호출할 때 마다 한 줄씩 읽은 문자열을 반환하며, Readlines()함수는 파일의 모든 내용을 줄단위로 잘라서 리스트를 반환 한다.
      • tell()함수는 현재 파일에서 어디까지 읽고 썻는지 위치를 반환하며, seek()함수는 사용자가 원하는 위치로 포인터를 이동한다.

       

      With ~ as 구문

       

       

       

      Pickle

      다음과 같이 리스트가 있다고 가정한다.

       

       

      아래와 같이 pickle 모듈의 dump함수를 사용하면, clolors를 다음과 같이 쉽게 파일에 저장할 수 있다.

       

       

      이번에는 파일로부터 다시 읽어본다. 우선 colors를 삭제한 후 load함수를 이용해서 리스트를 읽어 들인다.

       

       

      pickle로 파일에 쓰거나 읽을 떄는 반드시 바이너리 모드로 파일을 열어야 한다.

      pickle로 저장할 수 있는 대상은 파이썬 객체라면 거의 모두 가능하다.

      기본 자료형은 물론이고 아래 예제와 같이 사용자가 정의한 클래스 객체도 pickle이 가능한다.

       

       

       

       

       

      728x90
      반응형
    상단으로