5-2 모듈
모듈은 함수나 변수, 클래스를 모아 놓은 파이썬 파일이다.
다른 사람들이 이미 만들어 놓은 모듈을 사용하거나 직접 만들어서 사용할 수도 있다.
<모듈 만들기>
def add(a, b):
return a + b
def sub(a, b):
return a - b
이렇게 간단한 함수 2개를 만들고 mod.py에 저장한다.
import mod
print(mod.add(3, 4))
print(mod.sub(4, 2))
mod.py가 저장된 폴더와 같은 폴더에서 파이썬 파일을 만들고 import를 통해 모듈을 불러올 수 있다.
모듈 내의 함수를 사용하기 위해서 .을 붙이고 함수 이름을 입력하면 된다.
from mod import add
print(add(3, 4))
mod.py의 모듈 안에서 특정한 함수만 가져와서 사용하고 싶은 경우에는
from, import를 사용해 특정 함수를 가져올 수 있다.
이렇게 하면 mod.으로 안하고 그냥 함수 이름으로 바로 사용할 수 있다.
from mod import *
이렇게 *로 하면 mod 모듈 안에 있는 모든 함수를 불러올 수도 있다.
mod.py 파일에서 무언가를 실행하고 싶은 경우에
def add(a, b):
return a + b
def sub(a, b):
return a - b
print(add(1, 4))
print(sub(4, 2))
이런식으로 쓸 수 있다.
하지만 이렇게 하면, 다른 파일에서 import를 했을 때 print문이 실행되면서 함수만 불러오는 것이 아니라
출력값이 생겨버린다.
이런 현상을 막기 위해서는 해당 파일이 main에서 직접 실행되고 있을 때만 실행하라는 조건을 추가해주면 된다.
def add(a, b):
return a + b
def sub(a, b):
return a - b
if __name__ == "__main__":
print(add(1, 4))
print(sub(4, 2))
이렇게 코드를 수정하면 된다.
<다른 디렉터리에 있는 모듈 불러오기>
1. sys.path.append 사용하기
import sys
sys.path.append("불러올파일경로")
sys.path는 파이썬 라이브러리가 설치되어 있는 디렉터리들의 목록이다.
여기에 불러올 모듈 파일, mod.py와 같은 파일이 있는 디렉터리의 경로를 추가해주면,
아무 곳에서나 불러와서 사용할 수 있게 된다.
2. pythonpath 환경 변수 사용하기
set PYTHONPATH = 모듈 파일의 디렉터리 경로
미리 set 명령어로 환경변수에 모듈 파일이 있는 디렉터리를 설정해 놓으면
다른 디렉터리에서도 모듈 파일을 불러와 사용할 수 있다.
5-3 패키지
패키지는 관련 있는 모듈의 집합을 의미한다.
파이썬 패키지는 디렉터리와 파이썬 모듈로 이루어진다.
game/
__init__.py
sound/
__init__.py
echo.py
wav.py
graphic/
__init__.py
screen.py
render.py
play/
__init__.py
run.py
test.py
이런 식으로 계층적 구조로 패키지를 만들어서 관리할 수 있다.
패키지는 복잡한 프로그램에서 공동 작업이나 유지, 보수 등에서 유리하다.
<패키지 안의 함수 실행하는 법>
import game.sound.echo
game.sound.echo.echo_test()
from game.sound import echo
echo.echo_test()
from game.sound.echo import echo_test
echo_test()
3가지 방법으로 패키지 안의 함수를 불러와서 사용할 수 있다.
<__init__.py의 용도>
__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
또한, 패키지와 관련된 설정이나 초기화 코드를 포함하는 경우도 있다.
<패키지 변수 및 함수 정의>
VERSION = 3.5
def print_version_info():
print(f"version: {VERSION}")
이런 식으로 공통 변수, 함수를 설정할 수 있다.
import game
print(game.VERSION)
이렇게 불러와서 사용할 수 있다.
<패키지 내 모듈을 미리 import>
__init__.py 파일 안에 패키지의 다른 모듈을 미리 import 해서
패키지를 사용하는 코드에서 더 편하게 접근할 수 있게 한다.
from .graphic.render import render_test
이렇게 __init__.py파일 안에 미리 import를 해두면,
import game
game.render_test()
이렇게 다른 파일에서 더 간편하게 패키지 함수를 사용할 수 있다.
<패키지 초기화>
패키지를 처음 불러올 때 실행되어야 하는 코드를 작성할 수 있다.
데이터베이스 연결이나 설정 파일 로드와 같은 작업 수행 코드를 넣는다.
print("package Loading...")
예를 들어 이런 코드를 __init__.py 파일 안에 넣어두면,
다른 파일에서 import game으로 처음 import를 할 때 print문이 실행된다.
<__all__>
from game.sound import *
echo.echo_test()
이렇게 *로 import를 하고 echo모듈을 사용하면, 에러가 생긴다.
이 에러를 해결하기 위해서는 __init__.py 파일에 __all__ 변수를 설정하고,
import 할 수 있는 모듈을 미리 정의해줘야 한다.
__all__ = ['echo']
이런 코드를 추가해야 *를 사용해 import를 할 때 echo 모듈이 import 된다.
5-4 예외 처리
<오류 예외 처리 기법>
1. try-except문
try:
...
except [발생오류 [as 오류변수]]:
...
try-except문의 기본 구조이다.
여기서 except 구문을 3가지 방법으로 사용할 수 있다.
except:
except 발생오류:
except 발생오류 as 오류변수:
첫 번째는 오류의 종류에 상관없이 except 블록을 수행한다.
두 번째는 발생오류가 같은 종류일 때만 except 블록을 수행한다.
세 번쨰는 오류의 내용까지 알고 싶을 때 사용한다.
try:
4/0
excpet ZeroDivisionError as e:
print(e)
이렇게 하고 실행하면
division by zero 라는 오류 메시지가 e에 담겨서 출력된다.
2. try-finally문
finally는 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
try:
f = open("new.txt", 'w')
finally:
f.close()
보통 finally는 리소스를 close해야될 때 많이 사용된다.
3. 여러 개의 오류 처리하기
여러 개의 오류를 처리하려면 except를 여러 개 사용해서 나누면 된다.
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으 로 나 눌 수 없 습 니 다.")
except IndexError:
print("인 덱 싱 할 수 없 습 니 다.")
이런식으로 처리할 수 있다.
try:
a = [1,2]
print(a[3])
4/0
except (ZeroDivisionError, IndexError) as e:
print(e)
여러 개의 오류에 대해 같은 작업을 수행할 경우에는 괄호로 묶어서 처리할 수도 있다.
4. try-else문
try:
...
except [발 생 오 류 [as 오 류 변 수]]:
...
else: # 오 류
try문 수행중에 오류가 발생하면 except절, 오류가 발생하지 않으면 else절이 수행된다.
<오류 회피하기>
try:
f = open("나 없 는 파 일", 'r')
except FileNotFoundError:
pass
오류가 발생해도 그냥 통과시켜야 할 경우에는 pass명령어를 사용한다.
<오류 일부러 발생시키기>
오류를 강제로 발생시키려면 raise 명령어를 사용하면 된다.
<예외 만들기>
예외 처리를 위해서는 exception클래스를 상속하여 만들 수 있다.
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바 보':
raise MyError()
try:
say_nick("천 사")
say_nick("바 보")
except MyError:
print("허 용 되 지 않 는 별 명 입 니 다.")
이런식으로 예외 처리를 만들 수 있다.
5-5 내장 함수
1. abs
>>> abs(3)
3
>>> abs(-3)
3
>>> abs(-1.2)
1.2
입력값 숫자의 절댓값 리턴 함수any
2. all
>>> all([1, 2, 3])
True
>>> all([1, 2, 3, 0])
False
입력값의 데이터 요소가 모두 참이면 True, 거짓이 존재하면 False를 리턴한다.
0은 거짓이기 때문에 False를 리턴한다.
3. any
>>> any([1, 2, 3, 0])
True
any는 all과 반대로, 모두 거짓이면 False, 참이 존재하면 True를 리턴한다.
4. chr
>>> chr(97)
'a'
>>> chr(44032)
'가'
chr은 유니코드 숫자를 입력받아 해당 문자를 리턴한다.
5. dir
>>> dir([1, 2, 3])
['append', 'count', 'extend', 'index', 'insert', 'pop',...]
>>> dir({'1':'a'})
['clear', 'copy', 'get', 'has_key', 'items', 'keys',...]
dir은 객체가 지닌 변수나 함수를 보여준다.
첫번째는 리스트의 함수, 두번째는 딕셔너리의 함수를 보여준다.
6. divmod
>>> divmod(7, 3)
(2, 1)
divmod는 2개의 숫자 a, b를 입력받아서 a를 b로 나눈 몫과 나머지를 튜플로 리턴한다.
7. enumerate
>>> for i, name in enumerate(['body', 'foo', 'bar']):
... print(i, name)
...
0 body
1 foo
2 bar
enumerate는 데이터를 입력으로 받아서 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
8. eval
>>> eval('1+2')
3
>>> eval("'hi' + 'a'")
'hia'
>>> eval('divmod(4, 3)')
(1, 1)
eval은 문자열로 된 표현식을 입력 받아 실행한 결과를 리턴한다.
9. filter
def positive(l):
result = []
for i in l:
if i > 0:
result.append(i)
return result
print(positive([1,-3,2,0,-5,6]))
def positive(x):
return x > 0
print(list(filter(positive, [1, -3, 2, 0, -5, 6])))
filter은 함수, 반복 가능한 데이터를 입력으로 받아서
함수를 실행했을 때 리턴값이 참인 것만 묶어서 반환한다.
10. hex
>>> hex(234)
'0xea'
>>> hex(3)
'0x3'
hex는 정수를 입력받아 16진수 문자열로 변환해서 리턴한다.
11. id
>>> a = 3
>>> id(3)
135072304
>>> id(a)
135072304
>>> b = a
>>> id(b)
135072304
id는 객체를 입력받아서 객체의 고유 주솟값을 리턴한다.
12. input
>>> a = input()
hi
>>> a
'hi'
>>> b = input("Enter: ")
Enter: hi
>>> b
'hi'
input은 사용자의 입력을 받는 함수이다.
13. int
>>> int('3')
3
>>> int(3.4)
3
문자열 형태의 숫자나 소수를 입력받아서 정수를 반환하는 함수이다.
>>> int('11', 2)
3
>>> int('1A', 16)
26
int(x, radix)는 radix 진수로 표현된 x를 10진수로 변환해서 출력한다.
14. isinstance
>>> class Person: pass
...
>>> a = Person()
>>> isinstance(a, Person)
True
isinstance는 첫 번째 인수로 객체, 두 번째 인수로 클래스를 받는다.
입력된 객체가 클래스의 인스턴스이면 True, 아니면 False를 리턴한다.
15. len
>>> len("python")
6
>>> len([1,2,3])
3
>>> len((1, 'a'))
2
len은 입력값의 길이를 리턴한다.
16. list
>>> list("python")
['p', 'y', 't', 'h', 'o', 'n']
>>> list((1,2,3))
[1, 2, 3]
list는 데이터를 입력받아 리스트로 만들어서 리턴한다.
17. map
>>> def two_times(x):
... return x*2
...
>>> list(map(two_times, [1, 2, 3, 4]))
[2, 4, 6, 8]
map은 함수와 데이터를 입력받아 데이터의 각 요소를 함수에 적용한 결과를 리턴한다.
18. max
>>> max([1, 2, 3])
3
>>> max("python")
'y'
max는 데이터를 입력받아 최댓값을 리턴한다.
19. min
>>> min([1, 2, 3])
1
>>> min("python")
'h'
min은 데이터를 입력받아 최솟값을 리턴한다.
20. oct
>>> oct(34)
'0o42'
>>> oct(12345)
'0o30071'
oct는 정수를 8진수 문자열로 바꿔서 리턴한다.
21. open
open은 파일을 열어서 파일 객체를 리턴한다.
22. ord
>>> ord('a')
97
>>> ord('가')
44032
ord는 문자의 유티코드 숫자 값을 리턴한다.
23. pow
>>> pow(2, 4)
16
>>> pow(3, 3)
27
pow(x, y)는 x를 y제곱한 결과를 리턴한다.
24. range
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(5, 10))
[5, 6, 7, 8, 9]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
range는 입력받은 숫자에 해당하는 범위를 객체로 만들어 리턴한다.
숫자가 하나인 경우에는 0부터 시작한다.
세 번째 입력값으로 숫자 사이의 간격을 지정해 줄 수도 있다.
25. round
>>> round(4.6)
5
>>> round(4.2)
4
>>> round(5.678, 2)
5.68
round는 숫자를 입력받아 반올림해 리턴한다.
두 번째 인수로 몇번째 자리까지 반올림할지 소수점의 자릿수를 지정해 줄 수 있다.
26. sorted
>>> sorted([3, 1, 2])
[1, 2, 3]
>>> sorted(['a', 'c', 'b'])
['a', 'b', 'c']
>>> sorted("zero")
['e', 'o', 'r', 'z']
>>> sorted((3, 2, 1))
[1, 2, 3]
sorted는 입력 데이터를 정렬하고 정렬된 리스트를 리턴한다.
27. str
>>> str(3)
'3'
>>> str('hi')
'hi'
str은 문자열 형태로 객체를 변환해서 리턴한다.
28. sum
>>> sum([1,2,3])
6
sum은 입력 데이터의 합을 리턴한다.
29. tuple
>>> tuple("abc")
('a', 'b', 'c')
>>> tuple([1, 2, 3])
(1, 2, 3)
>>> tuple((1, 2, 3))
(1, 2, 3)
tuple은 입력 데이터를 튜플로 바꿔서 리턴한다.
30. type
>>> type("abc")
<class 'str'>
>>> type([ ])
<class 'list'>
>>> type(open("test", 'w'))
<class '_io.TextIOWrapper'>
type은 입력값의 자료형을 파악해서 알려준다.
31. zip
>>> list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]
>>> list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
zip은 동일한 개수로 이루어진 데이터들을 묶어서 리턴한다.
5-6 표준 라이브러리
표준 라이브러리는 파이썬 사용자들이 만든 유용한 프로그램을 모아 놓은 것이다.
유용하고 많이 사용되는 것을 위주로 알아본다.
1. datetime.date
연, 월, 일로 날짜를 표현할 때 사용한다.
>>> import datetime
>>> day1 = datetime.date(2021, 12, 14)
>>> day2 = datetime.date(2023, 4, 5)
>>> diff = day2 - day1
>>> diff.days
477
>>> day = datetime.date(2021, 12, 14)
>>> day.weekday()
1
import datetime으로 라이브러리를 불러오고, diff 함수로 날짜 사이의 간격을 알 수 이싿.
weekday 함수로 무슨 요일인지도 알 수 있다. 월요일 0 ~ 일요일 6이다.
2. time
time에는 시간 관련 유용한 함수들이 많다.
>>> import time
>>> time.time()
1684983953.5221913
time.time()은 현재 시간을 실수 형태로 리턴한다.
1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 표시한다.
>>> time.localtime(time.time())
time.struct_time(tm_year=2023, tm_mon=5, tm_mday=21, tm_hour=16,
tm_min=48, tm_sec=42, tm_wday=1, tm_yday=141, tm_isdst=0)
localtime은 time.time()으로 리턴한 값을 이용해 연, 월, 시, 분, 초의 형태로 바꿔준다.
>>> time.asctime(time.localtime(time.time()))
'Fri Apr 28 20:50:20 2023'
asctime은 localtime으로 리턴된 튜플을 받아서 날짜와 시간을 알아보기 쉬운 형태로 바꿔준다.
>>> time.ctime()
'Fri Apr 28 20:56:31 2023'
ctime은 time.asctime(time.localtime(time.time()))를 간단하게 표시하는 함수이다.
asctime과 다른 점은 항상 현재 시간만을 리턴한다는 점이다.
time.strftime('출 력 할 형 식 포 맷 코 드', time.localtime(time.time()))
>>> import time
>>> time.strftime('%x', time.localtime(time.time()))
'05/25/23'
>>> time.strftime('%c', time.localtime(time.time()))
'Thu May 25 10:13:52 2023
strftime은 시간에 관계된 것을 세밀하게 표현한다.
포맷코드는 이렇게 여러 종류가 있다.
# sleep1.py
import time
for i in range(10):
print(i)
time.sleep(1)
time.sleep함수는 일정한 시간 간격을 둔다.
3. math
math에는 다양한 수학적 함수들이 들어있다.
>>> import math
>>> math.gcd(60, 100, 80)
20
gcd 함수는 입력값들의 최대공약수를 리턴한다.
>>> import math
>>> math.lcm(15, 25)
75
lcm 함수는 최소공배수를 리턴한다.
4. random
random은 난수를 발생시키는 모듈이다.
>>> import random
>>> random.random()
0.53840103305098674
>>> random.randint(1, 55)
43
입력값을 주지 않으면 0에서 1 사이의 난수를 발생시키고
randint를 사용하면 이런 식으로 범위 안에서 무작위 정수를 발생시킬 수도 있다.
5. itertools
itertools.zip_longest 함수는 위에서 봤던 파이썬 내장 함수 zip함수와 똑같이 작동한다.
하지만 이 함수는 객체의 길이가 서로 다르면 긴 객체의 길이에 맞춰서 채운다.
import itertools
students = ['한 민 서', '황 지 민', '이 영 철', '이 광 수', '김 승 민']
snacks = ['사 탕', '초 컬 릿', '젤 리']
result = itertools.zip_longest(students, snacks, fillvalue='새 우 깡')
print(list(result))
[('한 민 서', '사 탕'), ('황 지 민', '초 콜 릿'), ('이 영 철', '젤 리'), ('이 광 수', '새 우 깡'
), ('김 승 민', '새 우 깡')]
이런 식으로 fillvalue를 설정해서 객체의 길이가 더 긴 쪽에 fillvalue로 맞춰서 채운다.
>>> import itertools
>>> list(itertools.permutations(['1', '2', '3'], 2))
[('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
permutations는 조합을 구해주는 함수이다.
>>> import itertools
>>> list(itertools.combinations(['1', '2', '3'], 2))
[('1', '2'), ('1', '3'), ('2', '3')]
비슷하게 combinations는 순서에 상관없는 경우의 수를 구해주는 함수이다.
6. functools.reduce
함수에 입력 데이터를 하나씩 누적 적용하면서 하나의 값으로 리턴하는 함수이다.
import functools
data = [1, 2, 3, 4, 5]
result = functools.reduce(lambda x, y: x + y, data)
print(result)
이렇게 사용하면
((((1+2)+3)+4)+5) 이런식으로 하나씩 누적 적용해서 계산한다.
7. operator.itemgetter
sorted와 같은 함수의 매개변수를 사용해서 정렬 기준을 정하도록 도와주는 모듈이다.
from operator import itemgetter
students = [
("jane", 22, 'A'),
("dave", 32, 'B'),
("sally", 17, 'B'),
]
result = sorted(students, key=itemgetter(1))
print(result)
이렇게 하면 1번째 요소인 나이로 정렬이 된다.(이름은 0번째 요소)
8. shutil
파일을 복사하거나 이동할 때 사용하는 모듈이다.
import shutil
shutil.copy("c:/doit/a.txt", "c:/temp/a.txt.bak")
이렇게 사용할 수 있다.
9. glob
디렉터리에 있는 파일들의 이름을 모두 알아야 할 때 유용하게 사용된다.
>>> import glob
>>> glob.glob("c:/doit/mark*")
['c:/doit\\marks1.py', 'c:/doit\\marks2.py', 'c:/doit\\marks3.py']
이렇게 파일 이름들을 리스트로 출력해준다.
10. pickle
객체의 형태를 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다.
>>> import pickle
>>> f = open("test.txt", 'wb')
>>> data = {1: 'python', 2: 'you need'}
>>> pickle.dump(data, f)
>>> f.close()
이렇게 dump 함수를 이용해 딕셔너리 객체를 그대로 파일에 저장할 수 있다.
>>> import pickle
>>> f = open("test.txt", 'rb')
>>> data = pickle.load(f)
>>> print(data)
{2:'you need', 1:'python'}
파일을 불러와보면, 딕셔너리 상태로 저장되어 있는 것을 확인할 수 있다.
11. os
os 모듈은 환경 변수, 디렉터리, 파일 등에서 os 자원을 제어할 수 있게 해주는 모듈이다.
os자원은 os(운영체제)에서 관리되는 여러 요소이다.
>>> import os
>>> os.environ
environ({'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': ⋯ 생 략 ⋯})
>>> os.environ['PATH']
'C:\\ProgramData\\Oracle\\Java\\javapath;...생 략...'
이런식으로 환경 변숫값을 알 수 있다.
>>> os.chdir("C:\WINDOWS")
>>> os.getcwd()
'C:\WINDOWS'
이렇게 chdir로 디렉터리 위치를 변경하거나 getcwd로 디렉터리 위치를 받을 수도 있다.
>>> os.system("dir")
>>> f = os.popen("dir")
>>> print(f.read())
system 함수로 시스템 명령어를 실행하거나 popen으로 시스템 명령어의 실행 결괏값을 받을 수 있다.
이런 유용한 os관련 함수들이 있다.
12. zipfile
import zipfile
# 파 일 합 치 기
with zipfile.ZipFile('mytext.zip', 'w') as myzip:
myzip.write('a.txt')
myzip.write('b.txt')
myzip.write('c.txt')
# 해 제 하 기
with zipfile.ZipFile('mytext.zip') as myzip:
myzip.extractall()
zipfile을 사용하면 파일을 묶어서 zip파일로 만들 수 있다.
with zipfile.ZipFile('mytext.zip') as myzip:
myzip.extract('a.txt')
특정 파일만 해제하고 싶으면 extract() 함수를 사용하면 된다.
with zipfile.ZipFile('mytext.zip', 'w', compression=zipfile.ZIP_LZMA,
compresslevel=9) as myzip:
(... 생 략 ...)
파일을 압축하고 싶으면 compression, compresslevel 옵션을 지정해주면 된다.
compression에는 이렇게 4가지 종류가 있고, compressionlevel은 압축 수준으로, 1~9 사이의 숫자를 사용한다.
13. threading
컴퓨터에서 동작하는 프로그램을 프로세스라고 하는데, 보통 1개의 프로세스는 1개의 일을 한다.
스레드를 사용하면 한 프로세스 안에서 2가지 이상의 일을 동시에 수행할 수 있다.
import time
def long_task(): # 5초 의 시 간 이 걸 리 는 함 수
for i in range(5):
time.sleep(1) # 1초 간 대 기 한 다.
print("working:%s\n" % i)
print("Start")
for i in range(5): # long_task를 5회 수 행 한 다.
long_task()
print("End")
이런 코드를 동작시키려면 5초가 5번 반복되어서 25초가 걸린다.
import time
import threading # 스 레 드 를 생 성 하 기 위 해 서 는 threading 모 듈 이 필 요 하 다.
def long_task():
for i in range(5):
time.sleep(1)
print("working:%s\n" % i)
print("Start")
threads = []
for i in range(5):
t = threading.Thread(target=long_task) # 스 레 드 를 생 성 한 다.
threads.append(t)
for t in threads:
t.start() # 스 레 드 를 실 행 한 다.
for t in threads:
t.join() # join으 로 스 레 드 가 종 료 될 때 까 지 기 다 린 다.
print("End")
하지만 이렇게 스레드를 사용해 코드를 수정하면 5초에 수행이 완료된다.
14. tempfile
파일을 임시로 만들어서 사용할 때 tempfile 모듈을 사용한다.
>>> import tempfile
>>> filename = tempfile.mkstemp()
>>> filename
'C:\WINDOWS\TEMP\~-275151-0'
mkstemp는 중복되지 않는 임시 파일을 만든다.
15. traceback
프로그램 실행 중 발생한 오류를 추적할 때 사용된다.
import traceback
def a():
return 1/0
def b():
a()
def main():
try:
b()
except:
print("오 류 가 발 생 했 습 니 다.")
print(traceback.format_exc())
main()
오 류 가 발 생 했 습 니 다.
Traceback (most recent call last):
File "c:\doit\traceback_sample.py", line 14, in main
b()
File "c:\doit\traceback_sample.py", line 9, in b
a()
File "c:\doit\traceback_sample.py", line 5, in a
return 1/0
ZeroDivisionError: division by zero
이렇게 trackback으로 오류 추적을 하면 어떤 오류가 발생했는지 로그가 나온다.
16. json
json은 JSON 데이터를 쉽게 처리할 때 사용되는 모듈이다.
{
"name": "홍 길 동",
"birth": "0525",
"age": 30
}
이렇게 myinfo.json파일이 있으면
>>> import json
>>> with open('myinfo.json') as f:
... data = json.load(f)
...
>>> type(data)
<class 'dict'>
>>> data
{'name': '홍 길 동', 'birth': '0525', 'age': 30}
json 모듈을 사용해서 딕셔너리로 json 파일을 읽어올 수 있다.
17. urllib
urllib은 URL을 읽고 분석할 때 사용되는 모듈이다.
import urllib.request
def get_wikidocs(page):
resource = 'https://wikidocs.net/{}'.format(page)
with urllib.request.urlopen(resource) as s:
with open('wikidocs_%s.html' % page, 'wb') as f:
f.write(s.read())
이렇게 url을 열고, html 파일로 저장할 수도 있다.
18. webbrowser
import webbrowser
webbrowser.open_new('http://python.org')
webbrowser.open('http://python.org')
open_new 함수를 이용하면 웹 페이지를 새 창으로 열 수 있고,
그냥 open을 이용하면 사용하던 브라우저에서 사이트를 열 수 있다.
5-7 외부 라이브러리
외부 라이브러리는 표준 라이브러리가 아니기 때문에 사용하려면 pip 도구를 이용해 설치해야 한다.
pip은 파이썬 모듈이나 패키지를 쉽게 설치할 수 있도록 도와주는 도구이다.
pip install 패키지명
pip uninstall 패키지명
pip install 패키지명==1.0.4
pip install --upgrade 패키지명
pip list
pip 을 붙이고 명령어를 쓰면 pip 명령어를 실행시킬 수 있다.
install과 uninstall로 패키지를 설치하고, 제거할 수 있다.
패키지명 뒤에 ==버전을 쓰면 특정 버전을 쓸 수 있고, 이를 쓰지 않으면 최신 버전이 설치된다.
--upgrade로 버전을 업그레이드할 수 있다.
list 명령어로 현재 설치된 외부 라이브러리들을 확인할 수 있다.
<Faker>
Faker는 테스트용 가짜 데이터를 생성할 때 유용하게 사용한다.
pip install Faker
먼저 Faker를 설치하고
>>> from faker import Faker
>>> fake = Faker()
>>> fake.name()
'Matthew Estrada'
이런 식으로 내장 함수를 이용해 임의의 데이터를 생성할 수 있다.
>>> fake = Faker('ko-KR')
>>> fake.name()
'김 하 은'
한글 이름이 필요하다면 ko-KR 을 전달해서 생성하면 된다.
>>> test_data = [(fake.name(), fake.address()) for i in range(30)]
여러 개의 데이터는 for문을 이용해 간단하게 만들 수 있다.
Faker에는 이런 함수들이 있다.
<sympy>
sympy는 방정식 기호를 사용하게 해 주는 외부 라이브러리이다.
pip install sympy
마찬가지로 pip으로 설치를 한다.
>>> from fractions import Fraction
>>> import sympy
x = sympy.symbols("x")
x, y = sympy.symbols('x y')
미지수를 나타날 때는 symbols 함수를 사용한다.
두 개 이상의 미지수가 필요하면 띄어쓰기로 구분해서 입력값을 넣는다.
f = sympy.Eq(x*Fraction('2/5'), 1760)
Fraction은 유리수를 표현하는 함수이고, Eq는 같다는 의미의 함수이다.
즉, x*(2/5) = 1760이라는 일차방정식을 표현한 것이다.
>>> result = sympy.solve(f)
>>> result
[4400]
그리고 solve 함수를 사용하면 해를 구할 수 있다.
'웹개발' 카테고리의 다른 글
flask - mySQL 연동 (0) | 2023.10.22 |
---|---|
flask (0) | 2023.10.20 |
점프 투 파이썬 4장 - 파이썬의 입출력 (0) | 2023.10.19 |
점프 투 파이썬 3장 - 제어문 (0) | 2023.10.19 |
점프 투 파이썬 2장 - 자료형 (0) | 2023.10.17 |