Python🐍 : パッケージ、モジュール📦


클래스, 함수, 변수의 집합=>모듈, 라이브러리, 패키지...の関係

モジュール


各種변수, 함수, 클래스を含むファイル.特定の機能は.py-機能別にコードをモジュールに分割する(ファイル単位)
作成したモジュールを活用したより簡単な開発
モジュールはPythonライブラリのコレクションパスや実行可能ファイルなどのパス内にある必要があります.
Python標準ライブラリ(Python Standard Library,PSL):Pythonに内蔵されているモジュール、パッケージ、および内蔵関数を組み合わせます.
  • module_ex.py
  • def mod_func1(param1):
        print(param1)
    
    def mod_func2(param1):
        print(param1)
    
    if __name__ == '__main__':    # 프로그램의 시작점일 때만 아래 코드 실행
        print('this is main')
    
    import module_ex
    
    module_ex.mod_func1("hi")
    
    ## import 모듈 as 모듈에 지정할 이름
    
    ## from 모듈 import 변수, 함수, 클래스
    
    from module_ex import mod_func1 - 특정 함수만 가져오는 것도 가능
    from module_ex import * - 전부 import
    
    from module_ex import mod_func1 as func, mod_func2 as func2
    
    #import 해제
    del module_ex
    
    #다시 import하기
    module_ex.reload()
    __main__ if __name__ == '__main__'現在のスクリプトファイルの実行状態を決定します.__name__は、モジュール名(クラス名)を格納する変数であり、Pythoninterpreterを使用してスクリプトを実行すると、モジュール名ではなく__main__が格納されます.
    したがって、__name__'__main__'を格納することは、プログラムの開始点に相当する.
    条件として、コードは、import되서(모듈로 사용)ではなく직접 실행(인 프로그램에서 사용)でのみ実行できます.

    小包


    特定の機能に関連する複数のモジュールを組み合わせて、モジュールにネーミングスペース(名前空間、ディレクトリ)を提供します.
    パッケージはモジュールのディレクトリと見なすことができます.
    ディレクトリに__init__.pyがある場合、フォルダはパッケージとして認識されます.
    ディレクトリ構造であるため、パッケージに他のパッケージが存在する可能性があります.패키지 -> 모듈 -> 클래스, 변수, 함수間の移動.パッケージを作成するときに異なるパッケージを使用すると、相互依存性が発生します.
  • package exパッケージ
  • init.py
  • #디렉토리를 패키지로 인식시키면서 패키지를 초기화한다
    
    __all__ = ["mod1"]
    
    #from . import 모듈 : 현재 패키지에서 모듈을 가져오게해서 패키지만 import하더라도 모듈 사용이 가능하다
    
  • mod1.py
  • class Mod1:
        def mod1_func(self):
            print("mod1 function!")
    
    
    #__name__을 통해 외부/내부 실행 여부를 확인가능
    if __name__ == "__main__":
        print("이 모듈이 직접 실행될 때 이 파트 실행됨")
        m1 = Mod1()
        m1.mod1_func()
    
    else:
        print("외부에서 모듈 호출될 때 실행되는 부분")
    
  • mod2.py
  • class Mod2:
        def mod2_func(self):
            print("mod2 function!")
    import package_ex.mod1
    m1 = package_ex.mod1.Mod1() #객채생성 
        #모듈내 클래스를 사용하려면 객채화해야한다.
    m1.mod1_func()
    
    from package_ex.mod2 import Mod2
    #import 구문에서는 모듈/패키지만 가능하고 클래스에 직접 접근할수 없지만
    #from import구문에서는 전부 가능하다.
    m2 = Mod2()
    m2.mod2_func()

    __all__


    開発者は、パッケージの作成時に公開される範囲を指定する必要があります.*を使用しても、限られた範囲の部分にはアクセスできません.__init__.py通過__all__値指定範囲
    (リスト形式で__all__が公開される모듈, 변수, 함수, 클래스を指定)
    from package_ex import *
    m1 = mod1.Mod1()
    m1.mod1_func()

    モジュールパッケージの場所の検索

    import inspect
    import random
    print(inspect.getfile(random))#random모듈의 위치 
    print(inspect.getfile(mod1))

    PIP

    pipは、Pythonによって作成されたパッケージを管理するためのプログラムである.
  • pypi.必要なパッケージをorgで検索
  • pip install(必要なパッケージ名を入力)
  • pip list:インストールリスト=pip freezepip show ~:インストールされたパッケージ情報pip install --upgrade ~ :パッケージのアップグレードpip uninstall ~:パッケージの削除sudo:権限エラーの場合、コマンドの前に追加できます.
    pypi:パッケージを管理するWebサイト

    内蔵/外付け関数

  • 内蔵関数
  • 組み込み関数Pythonに内蔵されており、別途import
    #input
    a=input()
    
    #dir: 객체를 넘겼을 때 객체가 가지는 변수, 함수를 표시
    print(dir())
    import random #외장 함수
    print(dir()) # random이 추가가됨
    
    print(dir(random)) # random이 가지는 함수들이 보여짐
    
    lst=[1,2,3]
    print(dir(lst)) # list에 관한 정보를 보여줌
  • 外部関数
  • がいぶかんすうは、importでなければ使用できない関数です.
    #glob : 경로내 폴더 파일 목록 조회 (window dir 명령어와 동일 기능)
    import glob 
    print(glob.glob("*.py")) #확장자가 py인 모든 파일
    
    #os : os가 제공하는 기본 기능들
    import os
    print(os.getcwd) #현재 디렉토리 확인
        #mkdir, 파일삭제 등등
    
    #time : 시간 관련 함수들
    import time
    print(time.localtime)
    print(time.strftime("%Y-%m-%d"))

    Excelパッケージ:OpenPyxl📊

    `pip install openpyxl` # 설치
    
    `import openxyl` #설치여부 확인

    読み取り


    Excelの1つのセルには、테두리, 배경색, 값, 폰트 등さまざまな情報が含まれています.
    
    from openpyxl import load_workbook
    
    wb = load_workbook(엑셀파일명) # 읽어서 클래스로 만듬
    data = wb.active #가장 마지막에 활성화되있던 엑셀 정보
    
    # 인덱싱으로 cell 하나 가져오기
    data['A1'].value #A1 = 셀 주소
    
    # 행이나 열 가져오기
    row = data['2'] #행
    col = data['A'] #열
    
    for cell in row or col:
    	cell.value
    
    # 여러행,열 / 영역 가져오기
    
    # 인덱싱으로 영역이나 열을 가져올 수 있다
    
    area = data['A1:B2']
    rows = data['A:B']
    cols = data['1:2']
    
    for row in area:
    	for cell in row:
    		cell. value
    		
    for col in cols:
    	for cell in col:
    		cell. value

    大規模Excelファイルの読み込み

    load_workbookすべてのExcelのコンテンツを一度に取得
    大きすぎると手に入らないか、長い時間がかかります.
    必要な部分だけ持っていったほうがいいです.
    
    from openpyxl import load_workbook
    
    wb = load_workbook(엑셀파일명, read_only=True) # 읽기 전용으로 하면 전체가 아니라 가지고 오는 데이터의 종류가 달라진다
    data = wb.active
    
    # 읽기 전용으로 가져올 경우 행 단위로 처리해주는 이 함수 사용 권장
    for row in data.iter_rows(): 
    	for cell in row:
    		cell.value
    	
    # 읽기 전용으로 파일을 가져오면 열단위로 가져올 수 없음
    # 읽기 전용으로 새로운 형식을 만드는데 열 단위는 순서가 얽히기 때문에 불가능
    

    書き込み


    Excelは1つのファイルに複数のページがあります
    いずれかの図面を選択して操作する
    
    from openpyxl import Workbook
    
    wb = Workbook()
    ws = wb.create_sheet(시트명) #새로운 시트를 생성
    
    #인덱싱으로 데이터 쓰기
    ws['A1'] = 'test' # 인덱싱으로 셀 하나에 데이터 입력
    
    wb.save(저장할 엑셀 파일 명)
    
    # 한번에 여러 개 입력
    ws.append(['a','b']) #행단위로 데이터 추가
    
    for i in range(10):
    	ws.append([i,i+2])
    
    wb.save(저장할 엑셀 파일 명)
    

    電子メール


    Eメール送信の原理

    smtp 서버 주소:メールを送信するサーバアドレスpop 서버 주소:メールを送信するサーバアドレスsmtp 서버 포트:smtpアドレスに移動するときに書き込むパス番号pop 서버 포트:popアドレスにジャンプしたときに書き込むパス番号계정 정보:ID、パスワード
    次の手順でEメールを送信します.
    サーバに必要なフォーマットでデータを処理する->smtpにログイン->smtpにデータを転送する

    電子メールの送信

    #이메일에서 요구하는 양식을 완성해줌
    from email.mime.text import MineText
    from email.mime.multipart import MIMEMultipart
    
    import smtplib
    
    import re # 정규식 관련
    
    SMTP_SERVER = 'smtp.gmail.com'
    SMTP_PORT = 465
    SMTP_USER = '[email protected]'
    SMTP_PASSWORD = '1234'
    
    #이메일 전송 함수 정의
    def send_mail(name(받는사람 이름), addr(받는사람주소), subject, contents ,attatchment=None): #첨부파일의 기본값 지정
    
    	#정규식(문자열을 패턴으로 표시하는 것)으로 이메일 유효성 검사
    	if not re.match('(^[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.]+)',addr):
    		print('Not email!')
    		return
    
    	msg  = MIMEMultipart('alternative') #텍스트 메일을 포함하는 형태라는 뜻
    
    	#첨부파일이 있을 경우
    	if attatchment:
    		msg = MIMEMultipart('mixed') # 이걸 안써주면 파일 첨부여부를 확인 불가
    
    
    	msg['From'] = SMTP_USER 
    	msg['To'] = addr
    	msg['Subject'] = name + '님,' + subject
    
    	text = MineText(contents,_charset='utf-8') 
    	# 실제 이메일에는 내용, 이미지등 여러가지가 섞여있다
    	msg.attach(text)#이어 붙이면서 전체 화면을 구성한다
    
    	if attatchment:
    		from email.mime.base import MINEBase
    		from email import encoders
    
    		file_data = MINEBase('application','octect-strean') #일반 파일을 위한 MINEBase클래스 생성
    		file_data.set_payload(open(attatchment, 'rb')).read())
    		encoders.encode_base64(file_data)
    	
    		#파일 명 지정
    		#attatchment에는 경로 전체가 들어오기 때문에 파일명만 추출한다
    		import os
    		fimename = os.path.basename(attatchment)
    
    		file_data.add_header('Content-Disposition' , 'attatchment; filename="'+filename+'"')
    		
    		msg.attach(file_data)
    
    	smtp = smtplib.SMTP_SSL(SMTP_SERVER ,SMTP_PORT )
    	smtp.login(SMTP_USER , SMTP_PASSWORD )
    	smtp.snedmail(SMTP_USER , addr, msg.as_string())
    	smtp.close()
    
    # 함수 사용 예시
    content  = '''
    안녕하세요
    테스트메일
    '''
    
    send_mail('홍길동','[email protected]', '제목',content)
    #보안 이슈도 발생할 수 있다 - 앱을 허용해야한다/보안 수준이 낮은 앱
    

    コメントとソース


    https://www.youtube.com/watch?v=kWiCuklohdY&ab_channel=%EB%82%98%EB%8F%84%EC%BD%94%EB%94%A9~~
    https://dojang.io/mod/page/view.php?id=2164