0816 TIL

35614 단어 TILpythonTIL

🪴 클래스

변수와 함수의 집합! ➡️ 나만의 자료형 만듦
클래스 안에 변수와 함수를 구현해 놓으면 "." 을 이용해 활용 가능!

  • 클래스 문법
class 클래스이름:
	def __init__(self):
    	self.변수명 = 변수값
        
    def 함수명(self, 인자값 변수명, ...):
    	실행할 코드
        실행할 코드
        실행할 코드
        
    def 함수명(self, 인자값 변수명, ...):
    	실행할 코드
        실행할 코드
        실행할 코드       

🌱 init 함수는?

  • "생성자" 라고 부르는 함수

  • 클래스 변수가 생성될 때 자동으로 호출되는 함수

  • 클래스 변수 안에 변수를 생성할 때 사용

class 클래스이름:
	def __init__(self):
    	self.변수명 = 변수값
  • 함수에 써있는 "self"는?
    • 클래스의 변수, 함수에 접근하기 위해 필요한 변수
      ➡️ self 안 쓰면 init 함수 내에서만 작동하는 지역변수가 되어서 class의 변수에 접근할 수 X!
    • 꼭! 잊지말고 써줘야 함!!
class SimpleTest:
    def __init__(self):
        # class 안에 my_data = 100인 변수가 만들어짐
        self.my_data = 100
        print('Call init!')


# simple 변수는 SimpleTest란 class 모양을 가진 함수가 된다. ➡️ 변수에 클래스를 넣어줌
simple = SimpleTest()
print(simple.my_data)


#####################################################
# self 안 썼을 때
class SimpleTest:
    def __init__(self):
        my_data = 100
        print('Call init!')

simple = SimpleTest()

# simple.my_data 'AttributeError' 발생!
# my_data 변수는 self. 가 안 붙어있기 때문에 __init__ 함수의 지역변수라 class에서 사용할 수 없다!
print(simple.my_data)

self는 꼭 잊지말고 써줘야 한다!!!!!

class SimpleTest:
	# print_skip 함수 파라미터의 self 변수는 카운트하지 않는다 ➡️ print_skip 함수는 총 1개의 파라미터를 갖고 있는 것과 마찬가지
    # self 는 꼭 꼭!! 써줘야 한다!! ➡️ class 내의 함수, 변수에 접근하기 위해 사용하는 것이기 때문!! (__init__함수 외에서도 self는 꼭 사용해줘야 함)
    def print_skip(self, string):
        if 'skip' in string:
            print('Skip')
            return

        print(string)

simple = SimpleTest()

simple.print_skip('bad')


🪴 모듈

🌱 클래스를 알아야 하는 이유

  • 클래스, 함수, 변수의 집합 ➡️ 모듈, 라이브러리, 패키지 등...

  • 모듈, 라이브러리, 패키지 등이 많아졌기 때문에 개발이 쉬워졌다는 말이 나옴!

모듈은 클래스, 함수, 변수 등을 활용하여 작성 됨.

➡️ 클래스 사용하는 방법에 익숙해져야 함!

🌱 모듈이란?

  • 한 파일에 계속해서 개발을 하는 것이 아닌, 여러 파일에 나눠 개발하는 것
    ➡️ "모듈" 로 나눠서 개발한다

  • 내가 원하는 기능들을 여러 파일에 클래스, 함수 등의 형태로 만들고 이것들을 가져다 쓰는 것
    ➡️ "가져다 쓸 수 있는 것" = 모듈

🌱 모듈 활용/사용하기 - from ~ import

  • 다른 파일의 코드 사용
# 파일 경로 작성시, main.py면 main만 입력!
from <py파일 경로> import <변수, 함수 혹은 클래스명>

# ex
from my_email import Email
from my_news import News
from my_excel import Excel

m_email = Email()
m_news = News()
m_excel = Excel()
  • 파일을 총 4개 만들어서 'my_~.py'엔 모듈을 생성하고 'auto.py' 파일에선 나머지 3개 파일들을 from import해서 사용

  • import만 사용하기
    총 2가지 방법이 있다.
    1. from 라이브러리/모듈(.py파일) import 함수/클래스 등
    2. import 라이브러리/모듈
    • import만 사용해 가져온 라이브러리/모듈에서 사용하고자 하는 클래스/함수 등을 .으로 불러오기
# ex
# 1.
# from 라이브러리/모듈 import 함수/클래스
# 라이브러리/모듈 안에 있는 함수/클래스 등 실행
from my_email import Email

# import 라이브러리/모듈
# 라이브러리/모듈(.py 파일)만 import로 가져오기
import my_news
from my_excel import Excel


m_email = Email()

# 2.
# Import만 사용해 가져온 라이브러리/모듈에서 사용하고자 하는 클래스/함수 등을 .으로 불러오기
m_news = my_news.News()

m_excel = Excel()

  • 폴더 안에 있는 .py 파일을 from ~ import 하고 싶을 때
# from 폴더명.파일명 import 클래스/함수 등
from testlib.my_email import Email

from my_news import News
from my_excel import Excel
  • (+) pycache
    : 파이썬 파일이 모듈로 사용됐을 때 생성되는 폴더
    삭제해도 된다

🌱 모듈 활용/사용하기 - name (내장변수)

name : 해당 클래스를 어디에서 실행했는지 나타낸다.
➡️ 이걸 사용해 해당 클래스를 테스트 해볼 수 있다.

  • 직접 해당 파일 실행시
__main__
  • 모듈 가져다 쓴 경우 (from ~ import)
    해당 파이썬 파일명 나온다 (폴더명.파일명 or 파일명)


🪴 텍스트 파일 읽고 쓰기

  • 파일의 모든 내용 출력
# open('파일명', 'r') : 해당 파일을 '읽기' 전용으로 열기
datafile = open('data.txt', 'r')

# .read() : 파일 내용 읽기
data = datafile.read()
print(data)
  • 파일 내용 1줄만(첫 줄) 출력
    .readline() : 1줄 읽어 온다.
# 파일 읽어오기
datafile = open('data.txt', 'r')

# .readline() : 1줄 읽어 온다.
# line = datafile.readline() : 이렇게 하면 '안녕하세요 + enter' 되어서 나온다.
# 원본 파일의 안녕하세요 다음 줄바꿈을 했기 때문에 그게 고스란히 나오는 것이다!
# 엔터 공백 없애려면 datafile.readline().strip() 사용!
line = datafile.readline()  # 1줄만 가져옴
print(line)
  • 파일 내용 1줄씩 다 출력
# 파일 읽어오기
datafile = open('data.txt', 'r')

line = 'init'
while line:  # 빈 공백만 아니면 '참'이기 때문에 line에 아무 문자열이나 집어넣은 것!
    line = datafile.readline().strip()
    print(line)
# line이 빈 문자열=거짓 일 때까지 반복하기 때문에 해당 파일의 텍스트가 다 출력된 것!
  • 사용자에게 입력 받은 내용을 파일에 출력 (내용 저장 X ➡️ 'w' 쓰기 옵션만 설정했기 때문)
    'w' : 쓰기
# 입력한 내용이 저장 X ➡️ 최근 입력한 값만 'textfile.txt'파일의 맨 첫 줄에 출력된다.

# 입력 받기
user_input = input('Input: ')

# 파일 'w' 옵션(쓰기)으로 열기
datafile = open('textfile.txt', 'w')

# write() 함수 : 입력값으로 내가 파일에 쓰고 싶은 문자열을 받는다.
datafile.write(user_input+'\n')

# 파일 닫는다
datafile.close()
  • 사용자에게 입력 받은 내용을 파일에 저장해 출력
    (내용 저장 O ➡️ 'a' 추가 옵션 설정했기 때문)
    • 사용자가 입력한 내용들이 차례로 해당 파일에 저장된다.
    • 'a' : 추가
user_input = input('Input: ')

# 'a' : append - 추가
datafile = open('textfile.txt', 'a')
datafile.write(user_input+'\n')
datafile.close()


🪴 텍스트 파일 다루기

🌱 csv 파일이란?

comma-separated values

  • ','(컬럼 구분)와 개행 문자(행 구분)로 구분된 파일
  • 엑셀과 유사한 형태로 읽고 쓸 수 있다.

🌱 csv 형태의 파일 읽기

.readlines() : 전체 내용을 행 단위로 [ ] 리스트 형태로 가져온다.

datafile = open('data.csv', 'r')

# .readlines() : 전체 내용을 행 단위로 [ ] 리스트 형태로 가져온다.
for line in datafile.readlines():
    data = line.strip().split(',')
    print(data[0])
    print(data[1])
    print(data[2])
    print('-'*10)

🌱 csv 형태의 파일 읽기

values = []
values.append(('alghost', 'fastone'))
values.append(('yskim', 'fastcampus'))
values.append(('jelee', 'fastfive'))

# 'result.csv' 이름의 csv 파일이 새로 생성된다.
datafile = open('result.csv', 'w')

for line in values:
    # '값'.join(값넣을곳) : 값넣을곳 사이 사이에 '값'을 넣고 싶다
    # line의 값 사이에 ',' 넣는다는 뜻
    data = ','.join(line)
    datafile.write(data+'\n')
datafile.close()

🌱 pypi

파이썬 패키지



🪴 엑셀 다루기 소개 및 패키지 설치

🌱 패키지란?

  • 특정 기능을 여러 클래스로 구성해 놓은 코드 집합

  • 파이썬이 기본적으로 가진 패키지도 많이 있음 ➡️ 기본 패키지

  • 대부분의 패키지는 '레퍼런스 문서'가 있다.

🌱 엑셀 다루는 패키지 - openpyxl

엑셀 다루는 패키지도 여러 종류가 있는데 그 중 openpyxl을 사용해볼 예정

  • 맥 다운로드 명령어
pip3 install openpyxl
  • 패키지 설치 확인 방법
    vscode 터미널에서 'python3' 입력시 밑의 이미지와 같은 메세지가 뜬다면 설치 완료된 것!
    import 사용해 패키지 가져온다



🪴 엑셀 파일 내용 읽기

🌱 원하는 엑셀 파일 가져오기

  • 데이터를 쓸 엑셀 파일의 파일명으로 클래스 변수 생성
    ➡️ load_workbook() 함수 이용해서 변수에 할당!

  • openpyxl 패키지의 load_workbook('파일명')함수
    ➡️ 기존에 있던 엑셀 파일을 파이썬 안으로 가져옴

    • 입력 값으로 '파일명'을 받는다.
    • 입력 값으로 받은 파일 내용을 읽어서 클래스로 만든다.
  • .active
    ➡️ "해당 변수의 활성화된 시트를 가져오겠다"
    활성화된 엑셀 시트 (가장 마지막에 사용했던 엑셀 시트가 열린다.)

# openpyxl이란 패키지 안에 load_workbook이란 함수 가져옴
from openpyxl import load_workbook

# load_workbook() : 입력 값으로 받은 파일 내용을 읽어서 클래스로 만들어줌
# load_workbook() 사용해 엑셀 파일을 파이썬 안으로 가져옴
# 클래스로 만든 것을 변수 wb에 할당함.
wb = load_workbook('simple_data.xlsx')

# .active : 활성화된 엑셀 시트 (가장 마지막에 사용했던 엑셀 시트가 열린다.)
# wb.active : "wb 변수의 활성화된 시트를 가져오겠다" 는 뜻
data = wb.active

# data['A1']  : []안에 셀 주소 들어간다.
# data['A1'].value : 'A1' 셀의 value 값을 가져온다는 뜻
print(data['A1'].value)
print(data['A2'].value)
print(data['B1'].value)
print(data['B2'].value)
  • 엑셀의 각 셀은 밑의 이미지에 나와있는대로 class 형태로 인식된다.


🌱 원하는 시트 지정해서 가져오기

  • 변수명['sheet_test']

['원하는시트명'] 인덱싱으로 원하는 시트를 가져올 수 있다.

# 여러 시트 중 원하는 시트 지정해서 가지고 오는 방법

from openpyxl import load_workbook
wb = load_workbook('simple_data.xlsx')

# wb['sheet_test'] : ['원하는시트명'] 인덱싱으로 원하는 시트를 가져올 수 있다.
data = wb['sheet_test']

# data['A1:B2'] : 엑셀에서 사용하는 방식 그대로 원하는 행/열 지정해서 가져올 수 있다.
area = data['A1:B2']
print(area)
for row in area:
    for cell in row:
        print(cell.value)

print('-'*20)

cols = data['A:B']
for col in cols:
    for cell in col:
        print(cell.value)

print('-'*20)

rows = data['1:2']
for row in rows:
    for cell in row:
        print(cell.value)

  • 이런 식으로 원하는 행/열 지정해 가져올 경우 area 값은 밑의 이미지와 같다.
    ➡️ 튜플 안에 튜플의 형식으로 cell class가 출력된다.
# 원하는 행/열 지정해 가져올 경우
area = data['A1:B2']




🪴 엑셀 파일에 내용 쓰기

🌱 엑셀 파일 생성 후 셀 값 생성 - 인덱싱

  • Workbook
    기존에 없는 엑셀 파일 가져오기 위해 (엑셀 파일 생성)

  • .create_sheet('시트이름')
    : 엑셀 시트 생성

  • 인덱싱 사용한 셀 값 할당
    변수['셀위치'] = '셀값'

# Workbook 클래스 : 기존에 없는 엑셀 파일 가져오기 위해 (엑셀 파일 생성)
from openpyxl import Workbook

# 클래스 변수 생성
wb = Workbook()

# .create_sheet('시트이름') : 엑셀 시트 생성
ws = wb.create_sheet('sheet_test2')

# 셀을 생성하고 값을 할당한다.
# 변수['셀위치'] = '셀값'
ws['A1'] = 'alghost'
ws['B1'] = 'test'

# .save('엑셀파일명') : 설정한 엑셀파일명으로 저장해준다.
wb.save('result2.xlsx')

🌱 엑셀 파일 생성 후 셀 값 생성 - 인덱싱

  • .append()
    • 행 단위로 데이터 넣을 때 사용
    • 입력 값에 리스트, 튜플의 형태로 데이터 넣기
from openpyxl import Workbook

wb = Workbook()
ws = wb.create_sheet('sheet_test3')

# .append() : 행 단위로 데이터 넣을 때 사용
# 리스트, 튜플의 형태로 데이터 넣기
ws.append(['Number', 'Name'])

# 위에서 한 번 .append()를 사용했기 때문에
#  for문의 내용은 2번째 행부터 들어가게 된다.
for i in range(10):
    ws.append([i, str(i) + ' data'])

wb.save('result3.xlsx')



🪴 큰 엑셀 파일 내용 읽기

  • load_workbook 의 문제점
    지정한 엑셀 파일의 모든 내용을 파이썬으로 한 번에 가져온다.
    ➡️ 용량 큰 경우, 속도 느림 등의 문제 발생
    • 엑셀 파일이 매우 큰 경우 못 가져오는 경우 발생
    • 한 번에 가져오는 과정이 매우 느림

🌱 해결 방법 - 필요한 부분만 가져오는 방법

  • load_workbook('엑셀파일명', read_only=True)
    read_only=True 해주면 읽기 전용 엑셀 파일이 된다

    • 엑세스 될 때마다 가져온다 (용량 큰 경우 합리적!)

    • 순서대로 행 단위씩 가져온다

    • iter_rows() 함수 사용을 권장!

  • iter_rows() 함수

    • (순서대로) 한 행씩 데이터를 가져오는 함수
    • .iter_rows(max_col=1, max_row=2)
      ➡️ 이런 식으로 영역 지정할 수 있다.
from openpyxl import load_workbook

# read_only=True : 읽기 전용 엑셀 파일이 된다.
# => read_only=True 사용시, .iter_rows() 함수 사용을 권장한다.
# => 엑세스 될 때마다 가져온다 (용량 큰 경우 합리적!)
# => "내가 필요할 때만 가지고 오게 된다"
wb = load_workbook('test_data.xlsx', read_only=True)
data = wb.active

# print(data['A']) => error : read_only=True는 순서대로 행 단위씩 가져오기 때문에
# 위처럼 열인 ['A']를 부르면 오류가 난다.

# .iter_rows() : (순서대로) 한 행씩 데이터를 가져오는 함수
# .iter_rows(max_col=1, max_row=2) : 영역 지정할 수 있다.
for row in data.iter_rows(max_col=1, max_row=2):
    for cell in row:
        print(cell.value)



🪴 이메일 발송 원리

🌱 필요한 설정 정보

  • SMTP 서버 주소 : 메일 보내는 서버 주소
  • POP 서버 주소 : 메일 받는 서버 주소
  • SMTP 서버 포트 : SMTP 주소로 갈 때 쓸 길 번호
  • POP 서버 포트 : POP 주소로 갈 때 쓸 길 번호
  • 계정 정보 : 아이디, 비밀번호

서버 - 하나의 컴퓨터라 생각
포트 - '길'
서버 인터넷 연결시 주소 ➡️ 포트

🌱 이메일 동작 원리

  • 사용자 ➡️ SMTP 서버
    "이렇게 이메일 보내줘"
    보낼 때 형식이 있다. 그 형식대로 보내야 한다.

  • 사용자 ➡️ POP 서버 (메일 받는 서버)
    "이메일이 오면 나한테도 보내줘"


메일을 보내기 위해선 서버가 원하는 형태의 모습으로 데이터 가공해야 한다

  • 보내는 사람, 받는 사람, 제목, 내용 등
  • SMTP 서버에 로그인
  • SMTP 서버로 데이터 전송

🌱 텍스트 이메일 보내기

27th

🌱 텍스트 이메일 주소 유효성 검사

27th

  • 정규 표현식

좋은 웹페이지 즐겨찾기