본문 바로가기
개발자모드/혼자공부하는파이썬

[파이썬#20][고급] 표준 모듈 (math, random, sys, os, datetime, time, urllib)

by 요니L 2022. 7. 20.

 

 


모듈의 정의

파이썬은 모듈이라는 기능을 활용해 코드를 분리하고 공유한다. 모듈은 여러 변수와 함수를 가지고 있는 집합체로, 크게 표준 모듈과 외부 모듈로 나뉜다. 파이썬에 기본적으로 내장되어 있는 모듈을 표준 모듈이라고 부르고, 다른 사람들이 만들어서 공개한 모듈을 외부 모듈이라고 부른다. 

 

import 모듈 이름

모듈을 가져올 때는 import 구문을 사용하고, 코드 가장 위에 작성한다. 


모듈 사용의 기본: math 모듈

math 모듈수학과 관련된 기능을 가지고 있다. 

import math

이렇게 "import math"라고 입력하면 해당 문장 이후에 'math'라는 모듈을 사용할 수 있다. 비주얼 스튜디오 코드에서 자동 완성 기능을 사용하면 math 모듈이 어떤 변수와 함수를 가졌는지 확인할 수 있다. 

 

자동 완성 기능으로 살펴보는 math 모듈의 변수와 함수

사인sin, 코사인cos, 탄젠트tan와 같이 수학 시간에 들었던 용어들이 보인다. 

 

그럼 간단하게 math 모듈을 사용하는 코드를 살펴보자. 수학에서 많이 사용하는 수학/삼각 함수를 사용해 보자.

import math

#사인
math.sin(1)
0.8414709848078965

#코사인
math.cos(1)
0.5403023058681398

#탄젠트
math.tan(1)
1.5574077246549023

 #내림
math.floor(2.5)
2

#반올림
math.ceil(2.5) 
3

 

↘ 모듈 문서

math 모듈은 많은 기능을 가지고 있다. 몇 가지 표로 정리하면 다음과 같다.

변수 또는 함수 설명
sin(x) 사인값을 구한다
cos(x) 코사인값을 구한다.
tan(x) 탄젠트값을 구한다.
log(x [, base]) 로그값을 구한다.
ceil(x) 올림한다.
floor(x) 내림한다.
round(x) 특이하게 반올림한다.
(정수 부분이 홀수 인 것들은 올림이 되고, 짝수인 것들은 내림이 된다.)

 

 

↘ 파이썬 라이브러리 문서

표준 모듈 등의 정보가 궁금할 때 가장 먼저 확인해야 하는 것은 파이썬 공식 문서이다. 

 

https://docs.python.org/3/library/index.html

 

The Python Standard Library — Python 3.10.5 documentation

The Python Standard Library While The Python Language Reference describes the exact syntax and semantics of the Python language, this library reference manual describes the standard library that is distributed with Python. It also describes some of the opt

docs.python.org

 

 

↘ from 구문

모듈에는 정말 많은 변수와 함수가 들어가 있다. 하지만 그중에서 우리가 활용하고 싶은 기능은 극히 일부일 수 있으며, math.cos(), math.sin()처럼 앞에 무언가 계속 입력하는 것이 귀찮다고 느껴질 수 있다. 이 때는 from 구문을 사용한다. 

 

from math import sin, cos, tan, floor, ceil

 

이럴 경우 math를 앞에 붙이지 않고도 사용할 수 있다.

만약에 math를 붙이는 것이 싫고, 모든 기능을 가져오는 것이 목적이라면 [*] 기호를 사용하면 된다. 다만 모든 것을 가져오면 식별자 이름에서 충돌이 발생할 수 있으니 from 구문을 사용할 때는 최대한 필요한 것들만 가져와서 사용하는 것이 좋다. 

from math import *

예시

 

 

↘ as 구문

모듈을 가져올 때 이름 충돌이 발생하는 경우가 있을 수 있다. 추가로 모듈의 이름이 너무 길어서 짧게 줄여 사용하고 싶은 경우도 있을 수 있다. 이때는 as 구문을 사용한다. 

import 모듈 as 사용하고 싶은 식별자

math 모듈을 m이라는 이름으로 사용할 수 있다. 

 


random 모듈

random 모듈은 랜덤한 값을 생성할 때 사용하는 모듈이다. 

import random

random 모듈을 import 한 뒤, random을 입력하고 뒤에 마침표(.)를 찍으면 자동 완성 기능으로 random 모듈이 가지고 있는 기능들을 확인할 수 있다. 

 

<random 모듈 문서>

https://docs.python.org/3/library/random.html#examples

 

random — Generate pseudo-random numbers — Python 3.10.5 documentation

random — Generate pseudo-random numbers Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform selection of a ran

docs.python.org

 

▷ random 모듈

import random
print(" #random 모듈")

# random(): 0.0 <= x < 1.0 사이의 float를 리턴
print("ulog random():" , random.random)

# uniform(min, max): 지정한 범위 사이의 float를 리턴
print("ulog uniform(10,20):" , random.uniform(10,20))

# randrange(): 지정한 범위의 int를 리턴
# - randrange(max): 0부터 max 사이의 값 리턴
# - rnadrange(min, max) min부터 max 사이의 값을 리턴
print("ulog randrange(10):" , random.randrange(10))

# choice(list) 리스트 내부에 있는 요소를 랜던하게 선택
print("ulog choic([1,2,3,4,5]):" , random.choice([1,2,3,4,5]))

# shuffle(list) 리스트의 요소들을 랜던하게 섞는다.
print("ulog shuffle([1,2,3,4,5]):" , random.shuffle([1,2,3,4,5]))

# sample(list, k=<숫자>) 리스트의 요소 중에 k개를 뽑는다.
print("ulog sample([1,2,3,4,5], k=2):" , random.sample([1,2,3,4,5], k=2))

[실행결과]

PS D:\app\python> python module_random.py
 #random 모듈
ulog random(): <built-in method random of Random object at 0x000001A176B952E0>
ulog uniform(10,20): 16.607211811409318
ulog randrange(10): 6
ulog choic([1,2,3,4,5]): 4
ulog shuffle([1,2,3,4,5]): None
ulog sample([1,2,3,4,5], k=2): [1, 3]

 

[random]을 계속해서 입력하면 귀찮아서 random 모듈은 이전에 배웠던 from 구문을 활용해서 임포트 하는 것이 일반적이다. 

  from random import random, randrange, choice

 


sys 모듈

sys 모듈시스템과 관련된 정보를 가지고 있는 모듈이다. 명령 매개변수를 받을 때 많이 사용된다.

 

▷ sys 모듈

# 모듈을 읽어 들인다.
import sys

# 명령 매개변수를 출력
print(sys.argv)
print("-----")

# 컴퓨터 환경과 관련된 정보를 출력
print("getwindowsversion:()", sys.getwindowsversion())
print("-----")
print("copyright: ", sys.copyright)
print("-----")
print("version:", sys.version)

# 프로그램을 강제로 종료
sys.exit

[실행결과]

PS D:\app\python> python module_sys.py 10 20 30
['module_sys.py', '10', '20', '30']
-----
getwindowsversion:() sys.getwindowsversion(major=10, minor=0, build=19043, platform=2, service_pack='')
-----
copyright:  Copyright (c) 2001-2022 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
-----
version: 3.10.5 (tags/v3.10.5:f377153, Jun  6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)]

 


os 모듈

os 모듈운영체제와 관련된 기능을 가진 모듈이다. 새로운 폴더를 만들거나 폴더 내부의 파일 목록을 보는 일도 모두 os 모듈을 활용해서 처리한다. 

 

▷ os 모듈

import os

# 기본 정보를 몇 개 출력
print("현재 운영체제:" , os.name)
print("현재 폴더:" , os.getcwd)
print("현재 폴더 내부의 요소:" , os.listdir)

# 폴더를 만들고 제거한다. (폴더가 비어있을 때문 제거 가능)
os.mkdir("hello")
os.rmdir("hello")

# 파일을 생성하고 + 파일 이름을 변경
with open("original.txt", "w") as file:
    file.write("hello")
os.rename("original.txt", "new.txt")

#파일을 제거
os.remove("new.txt")
#os.unlink("new.txt")

# 시스템 명령어 실행
os.system("dir")


[실행결과]

PS D:\app\python> python module_os.py
현재 운영체제: nt
현재 폴더: <built-in function getcwd>
현재 폴더 내부의 요소: <built-in function listdir>
 D 드라이브의 볼륨: 새 볼륨
 볼륨 일련 번호: 4EBC-0940

 D:\app\python 디렉터리

2022-07-19  오전 09:16    <DIR>          .
2022-07-19  오전 09:16    <DIR>          ..
2022-07-18  오전 09:28               676 except03.py
2022-07-18  오전 09:33               790 except_all.py
2022-07-15  오전 09:20               324 file_closed04.py
2022-07-12  오전 11:36               191 file_open.py
2022-07-12  오전 11:43               152 file_open_with.py
2022-07-12  오전 11:54               139 file_read.py
2022-07-13  오전 09:47               802 file_readlines.py
2022-07-13  오전 09:34               582 file_write.py
2022-07-15  오전 09:35               456 finally_loop.py
2022-06-20  오후 04:05    <DIR>          글꼴
2022-06-21  오후 04:32    <DIR>          설치프로그램
             123개 파일              39,377 바이트
               5개 디렉터리  552,814,489,600 바이트 남음

 

※ os.system() 함수의 위험성

os.system() 함수는 명령어를 그냥 실행한다. os.system("rm -rf /") 와 같은 명령어를 실행하면 컴퓨터의 모든 것을 삭제한다. os.system() 함수는 굉장히 위험할 수 있는 함수라는 것을 기억하자!

 

 

 


datetime 모듈

datetime 모듈date(날짜), time(시간)과 관련된 모듈로, 날짜 형식을 만들 때 자주 사용되는 코드로 구성되어 있다. datetime 모듈을 사용해서 날짜를 출력하는 다양한 방법을 알아보자. 

 

▷ datetime 모듈

# 모듈을 읽어 들인다.
import datetime as dt


# 현재 시각을 구하고 출력
print("# 현재 시각 출력하기")
now = dt.datetime.now()
print(now.year, "년")
print(now.month, "월")
print(now.day, "일")
print(now.hour, "시")
print(now.minute, "분")
print(now.second, "초")
print()

# 시간 출력 방법
print("# 시간을 포맷에 맞추어 출력하기")
output_a = now.strftime("%Y.%m.%d %H:%M:%S")
output_b = "{}{}{}{}{}{}초".format(now.year,\
    now.month,\
    now.day,\
    now.hour,\
    now.minute,\
    now.second)

# 문자열, 리스트 등 앞에 [*]를 붙이면 요소 하나하나가 매개변수로 지정된다~!!
output_c = now.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초")

# 출력
print(output_a)
print(output_b)
print(output_c)
print()

[실행결과]

PS D:\app\python> python module_datetime.py
# 현재 시각 출력하기
2022 년
7 월
19 일
9 시
37 분
29 초

# 시간을 포맷에 맞추어 출력하기
2022.07.19 09:37:29
2022년 7월 19일 9시 37분 29초
2022년 07월 19일 09시 37분 29초

 

output_a 처럼 strftime() 함수를 사용하면 시간을 형식에 맞춰 출력할 수 있다. 다만 한글은 매개변수에 넣을 수 없다. 그래서 이를 보완하고자 output_b, output_c 같은 형식을 사용한다.

 

 

▷ 시간 처리하기

# 모듈을 읽어 들인다.
import datetime
now = datetime.datetime.now()

# 특정 시간 이후의 시간 구하기
print("# datetime.timedelta로 시간 더하기")
after = now + datetime.timedelta(\
    weeks=1,\
    days=1,\
    hours=1,\
    minutes=1,\
    seconds=1)

print(after.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))
print()

# 특정 시간 요소 교체하기
print("# now.replace() 로 1년 더하기")
output = now.replace(year=(now.year+1))
print(output.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))

[실행결과]

PS D:\app\python> python module_datetime_add.py
# datetime.timedelta로 시간 더하기
2022년 07월 27일 10시 47분 24초

# now.replace() 로 1년 더하기
2023년 07월 19일 09시 46분 23초

 

timedelta() 함수를 사용하면 특정한 시간의 이전 또는 이후를 구할 수 있다. 다만 timedelta() 함수는 1년 후, 2년 후 등의 몇 년 후를 구하는 기능이 없다. 그래서 1년 후를 구할 때는 replace() 함수를 사용해 아예 날짜 값을 교체하는 것이 일반적이다. 

 


time 모듈

시간과 관련된 기능을 다룰 때는 time 모듈을 사용한다. time 모듈로도 날짜와 관련된 처리를 할 수 있지만, 그런 처리는 datetime 모듈을 사용하는 경우가 더 많다.

 

time 모듈을 유닉스 타임을 구할 때, 특정 시간 동안 코드 진행을 정지할 때 많이 사용한다.

 

import time

그럼 굉장히 자주 사용되는 time.sleep() 함수를 알아보겠다. time.sleep() 함수는 특정 시간 동안 코드를 정기할 때 사용하는 함수이다. 매개변수에는 정지하고 싶은 시간을 초 단위로 입력한다. 

 

▷ time 모듈

import time

print("지금부터 5초간 정지합니다!!")
time.sleep(5)
print("5초경과: 프로그램을 종료합니다. ")

[실행결과]

PS D:\app\python> python module_time.py
지금부터 5초간 정지합니다!!
5초경과: 프로그램을 종료합니다. 

매우 자주 사용하는 기능이며 어렵지 않으므로 외워두자!


urllib 모듈

urllib 모듈"URL을 다루는 라이브러리"라는 의미이다.

이때 URL(Uniform Resource Locator)이란 어렵게 표현하면 네트워크의 자원이 어디에 위치하는지 확인할 때 사용하는 것이다. 간단하게 '웹 브라우저의 주소창에 입력하는 주소'라고 이해하면 된다. urllib 모듈은 인터넷 주소를 활용할 때 사용하는 라이브러리이다. 

 

▷ urllib 모듈

# 모듈을 읽어 들인다
from urllib import request

# urlopen() 함수를 구글의 메인 페이지를 읽는다.
target = request.urlopen("http://google.com")
output = target.read()

# 출력
print(output)

[실행결과]

PS D:\app\python> python module_urllib.py
b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ko"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title>
<script> ...</script>        
</body></html>'

일단 from urllib import request를 사용해 urllib 모듈에 있는 request를 가져왔다. 이때 request도 모듈이라 이후의 코드에서 request 모듈 내부에 있는 urlopen() 함수를 request.urlopen() 형태로 사용했다.

urlopen() 함수URL 주소의 페이지를 열어주는 함수이다. 구글의 메인 페이지 주소를 넣어보았는데 이렇게 입력하면 웹 브라우저에 http://google.com을 입력해서 접속하는 것처럼 파이썬이 http://google.com에 들어가 준다. 이어서 read() 함수를 호출하면 해당 웹 페이지에 있는 내용을 읽어서 가져온다. 

 

실행결과를 보면 문자열처럼 보이지만, 앞에 'b'라는 글자가 붙어 있다. 이는 바이너리 데이터를 의미하는 것이다. 

 


모듈과 함수 무조건 외울 필요 없다. import, from, as 키워드를 사용하는 방법만 확실하게 기억해 두자.

 


연습문제

(연습문제 329p-1)

Q. 다음 중 math 모듈의 함수를 제대로 읽어 들이지 못하는 코드는?

① import math

② import sin, cos, tan from math

③ import math as m

④ from math import * 

 

[정답] ②

올바른 표기) from math import sin, cos, tan

 

 

(연습문제 329p-2)

Q. 파이썬 문서를 보면서 본문에서 살펴보지 않았던 모듈의 이름을 다섯 개 적어보자. 그리고 해당 모듈에 어떤 기능들이 들어 있는지도 간단하게 적어보자.

번호 모듈 이름 모듈 기능
0 wave 모듈 wav 음악 형식과 관련된 처리를 할 때 사용
1 http 모듈 HyperText Transfer Protocol 작업을 위한 여러 모듈을 수집하는 패키지
2 ftplib 모듈 FTP 프로토콜의 클라이언트 측을 구현할 때 사용
3 colorsys 모듈 컴퓨터 모니터에 사용되는 RGB색 공간과 YIQ, HLS(Hue Lightness Saturation) 및 HSV(Hue Saturation Value)의 다른 세 가지 좌표 시스템에서 표현되는 색상 간의 색상 값의 양방향 변환을 정의
4 socketserver 모듈 네트워크 서버 작성 작업을 단순화할 때  사용

 

(연습문제 330p-3)

Q. os 모듈의 os.listdir() 함수와 os.path.isdir() 함수를 사용하면 특정 디렉토리를 읽어 파일 디렉토리인지 확인할 수 있다. 직접 코드를 작성하고 실행해 보자. 실행하는 위치에 따라서 출력 결과가 달라진다. 

 

▷ 현재 디렉토리를 읽어 들어고 파일인지 디렉토리인지 구분하기 

# 모듈을 읽어 들인다.
import os

# 현재 폴더의 파일/폴더를 출력
output = os.listdir(".")
print ("os.listdir: ", output)
print()

# 현재 폴더의 파일/폴더를 구분한다.
print("# 폴더와 파일 구분하기")
for path in output:
    if os.path.isdir(path):
        print("폴더:", path)
    else:
        print("파일:",path)

[실행결과]

PS D:\app\python\os_test> python 330p-3-1.py
os.listdir:  ['330p-3-1.py', 'test1']

# 폴더와 파일 구분하기
파일: 330p-3-1.py     
폴더: test1
PS D:\app\python\os_test>

 

그리고 이를 활용해서 '폴더라면 또 탐색하기' 라는 재귀 구성으로 현재 폴더 내부에 있는 모든 파일을 탐색하도록 코드를 작성해 보자. 

 

# 모듈을 읽어 들인다.
import os

# 폴더를 읽어 들이는 함수
def read_folder(path):
    #폴더의 요소 읽어들이기
    output = os.listdir(path)

    # 폴더의 요소 구분하기
    for item in output:
        if os.path.isdir(item): 
            # 폴더라면 계속 읽어 들이기
            print("폴더:", item)
            read_folder(path + "/" + item)
        else:
            # 파일이라면 출력하기
            print("파일:", item)

# 현재 폴더의 파일/폴더를 출력
read_folder(".")

[실행결과]

PS D:\app\python\os_test> python 330p-3.py
파일: 330p-3-1.py
파일: 330p-3.py
폴더: test1
파일: 안녕.txt
PS D:\app\python\os_test>

 

 

여기까지.

 

 

 

 

댓글