본문 바로가기
Appz Knowledge/Python

Python 혼공노트 6 - 모듈

by 스쳐가는인연 2023. 3. 6.

Python 혼공노트 6.

- 혼자 공부하는 파이썬(개정판) 청강하며... (그외 파이썬 강의도 …)

 

모듈: 관심/목적에 따라 묶음

- 파일 또는 폴더를 활성하여 활용/구성

 

라이브러리: 정상 제어를 하는 모듈

정상제어 > 필요에 따라, 모듈의 기능을 개발자가 직접 호출 (e.g.) math, beautifulsoup, etc..)

 

프레임워크: 제어 역전이 발생하는 모듈

제어역전 > 필요한 경우, 모듈이 개발자가 만든/만들 기능을 스스로(?) 호출 (e.g.) flask, etc..)

 

 

기본적인 활용방법

a. 목적 인지 - 무엇을 하고자 하는지 (가장 주요한 포인트)

b. 관련 검색 - 목적을 수행하고자 할 때 필요한 것에 대한 구글링

c. 코드 참조 확인된/검색된 코드 활용

d. 반복 사용 자주 사용하게 되는 코드는 재활용/암기

 

파이썬 모듈 문서: 모듈에 대한 정보를 열람 가능

파이썬 표준 라이브러리:

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

 

아래 3가지 방법으로, import 키워드를 통해 가장 뒤에 명시된 항목을 읽어 들여 활용함.

import module_name # “모듈을 식별자로 읽어들임

import module_name as # 모듈을 이라는 별도의 식별자로 읽어들임

from module_name import 변수/함수/클래스 # 변수/함수/클래스를 식별자로 읽어들임

# 읽어들일 대상은 ‘,’로 구분하여 여러 개를 한번에 읽을 수 있음

 

- 현재 실행 중인 파일과 같은 위치에서 모듈이름이라는 파일 또는 폴더가 존재하는 지 확인

> 존재하지 않는 경우, 환경 변수에 등록되어 있는 경로 중 위치에서 확인

> 활용하고자 하는 특정 모듈과 동일한 다른 용도의 같은 이름의 파일이 존재하는 경우, 의도하지 않은 오류를 경험할 수 있음에, 파일명 작성 시, 모듈 이름을 사용하지 않도록 유의 필요.

 

e.g.)

import math

import pandas as pd

import numpy as np

import tensorflow as tf

from bs4 import BeautifulSoup

 

알아두면 피가되고 살이되는 많이 사용되는 모듈 및 함수

import random

print(random.uniform(10, 20)) # 10~20 사이의 float 형 난수를 생성

print(random.randrange(10, 20)) # 10~20 사이의 int 형 난수를 생성

print(random.choice([1,2,3,4,5,6])) # 주어진 범위(리스트) 중 하나를 임의로 선택

 

import sys

sys.argv

sys.path

 

import os

os.name

os.listdir(“.”)

os.mkdir(“directory_name”)

os.rmdir(“directory_name”)

os.rename(“old_directory_name”, “new_directory_name”)

os.remove(“directory_name”)

os.system(“system_command”)

 

import time

time.sleep(sec) # n sec 동안 코드 실행을 임시 정지

 

from urllib import request

target = request.urlopen(https://google.com)

print(target.lead())

 

 

모듈 예제

---------------------------------------------------------------

Hellomodule.py:

class Circle:

    def __init__(self, 반지름):

        if 반지름 < 0:

            raise ValueError()

        self.__PI = 3.14

        self.__반지름 = 반지름

    def 넓이(s):

        return s.__PI * s.__반지름 ** 2

    def 둘레(s):

        return 2 * s.__PI * s.__반지름

 

If __name__ = “__name__” # hellomodule이 모듈이 아닌 main으로 실행될 때만 수행되는 코드

    print(“넓이() 검증”)

    if Circle(10).넓이() – 314 < 10 ** -7: # 부동소수점 연산은 연산 결과가 정확히 떨어지지 않아 “==”로 확인불가

        print(“넓이() 검증 완료: Success”)

    print(“둘레() 검증”)

    else:

        print(“검증실패: fail”)

    if Circle(10).둘레() – 62.8 < 10 ** -7:

        print(“둘레() 검증 완료: Success”)

    else:

        print(“검증실패: fail”)

 

main.py:

# ------------------------------------

# from hellomodule import Circle

# c = Circle(10)

# ------------------------------------

 

Import hellomodule as h

c = h.Circle(10)

print(c.넓이())

print(c.둘레())

 

cf. __name__ # 모듈인지 확인 가능

print(__name__)

모듈인 경우: 모듈명을 반환 – hellomodule

메인인 경우: “__name__”을 반환

 

Note. 모듈 내용이 변경되는 경우, 해당 모듈의 변경이 정상인지 결과 및 영향도 등을 확인하고자 할 때 활용가능

 

 

패키지: 모듈의 규모가 커졌을 때, 모듈을 나누는 방법 / 덩치 큰 클래스들을 별도 파일로 구분하는 경우가 많음

- 폴더 내부에 존재하는 모듈을 로드

from .foldername.class_filename import Classname

from .foldername.class_filename import *    #단일 Class만 존재하는 경우 ‘*’로 대체 가능

Note. ‘.’로 상대경로를 지정

 

- 폴더 자체를 모듈로 로드

폴더 내부에 “__init__.py”를 구현

 

__init__.py:

__all__ = [접근허용할_Class명을 list로 나열] # 외부에서 대상 모듈에 접근 시 사용/접근을 허용할 항목들.

Note. 명시되지 않은 것은 접근되지 않음.

 

기본내장모듈(built-in module)

e.g.)

Math

Sys

Time

 

외부 모듈(external module): # 추가 설치 필요

pip install module_name

 

e.g)

Web dev

Flask, Django

 

Web scraping

beautifulsoup4, requests

 

machine learning

tensorflow, scikit-learn

 

video analyze

cv2, pillow, webcam-streamer

 

music

python-midi, midi, Mido

 

 

기상청 예보를 통한 BeautifulSoup 연습

from urllib import request

from bs4 import BeautifulSoup

 

kma_url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"

 

def get_text(kma_url):

    try:

        res = request.urlopen(kma_url)

        soup = BeautifulSoup(res, 'html.parser')

       

        for location in soup.select("location"):

            city = location.select_one("city").string

            print(city)

            for data in location.select("data"):

                time = data.select_one("tmEf").string

                status = data.select_one("wf").string

                min_temp = data.select_one("tmn").string

                max_temp = data.select_one("tmx").string

 

                #print(time)

                #print(status)

                #print(min_temp)

                #print(max_temp)

 

    except:

        print("failed crawling")

 

get_text(kma_url)

 

 

기상청 예보를 통한, Flask, BeautifulSoup 연습

 

from urllib import request

from bs4 import BeautifulSoup

from flask import Flask

 

# 기상청 홈페이지의 RSS 정보 얻기

kma_url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"

res = request.urlopen(kma_url)

app = Flask(__name__)

 

@app.route("/")

def weather():

    output = ""

    soup = BeautifulSoup(res, 'html.parser')

       

    for location in soup.select("location"):

        city = location.select_one("city").string

 

        for data in location.select("data"):

            time = data.select_one("tmEf").string

            status = data.select_one("wf").string

            min_temp = data.select_one("tmn").string

            max_temp = data.select_one("tmx").string

 

            output += f"<h3>{city} {time} {status} {min_temp} {max_temp}</h3>"

        return output

 

- 완강 -

 

 

 

 

 

 

 

 

 

 

반응형