ํ์ฌ ์๊ฐํ๊ณ ์๋ ์น๊ฐ๋ฐ ์ฝ์ค์์๋ ํ์ด์์ ํ์ ๊ณผ์ ๊ฐ ๋๋ ๋๋ง๋ค ์ํธํ๊ฐ ๋ด์ฉ์ ์ด๋ฉ์ผ๋ก ๋ณด๋ด์ค๋ค.
์ ๋ฆฌ๋ฒฝ์ด ๋์ ธ์ ํ๋ํ๋ ๋ค ๊ธ์ด ์ ๋ฆฌํด๋ณผ๊น ์ถ์๋๋ฐ, ๋งค๋ฒ ๋ด์ฉ์ ์ง์ ๊ธ์ด ์์ ์ ๋ฆฌํ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋กญ๊ณ , ๊ท์ฐฎ์๋ค.
โจ โจ ๊ทธ๋ฌ๋ค ์ ์ง ํ์ด์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋งค์ฐ ๊ฐ๋จํ ์์ ์ด ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
Python ์ ๋ฅ์ํ๊ฒ ๋ค๋ฃจ์ง๋ ์์ง๋ง, ์ฌ๋ฌ ๋ชจ๋์ ์จ ๋ณธ๋ค๋ฉด ์ด ๋ชจ๋ ๋ฆฌ๋ทฐ ๋ฉ์ผ์ ํ ๋ฒ์ ๋ชจ์์ ๋ด๊ฐ ์ํ๋ ํํ์ ํ์ผ๋ก ์ ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋์ ์์๋ณธ ๊ฒ์ด ๋ฐ๋ก python ์ imaplib ๋ชจ๋์ด๋ค.
์ด๋ฒ ๊ธ์ ๊ฐ์ธ ์๋ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋๋ฐ ๋ฐฐ์ด ๋ด์ฉ๊ณผ ์์ฑํ ์ฝ๋๋ฅผ ์ค์ ์ผ๋ก ์ ๋ฆฌํด๋ณธ๋ค.
ํ์ด์ฌ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ ์์ฌ์ด ๋ชจ๋ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฉ์ด๋ค. ๋ด์ฅ ๋ชจ๋์ ๋ฌผ๋ก pip (ํ์ด์ฌ ํจํค์ง ์ค์น ๊ด๋ฆฌ์) ๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋์ด์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฌํ ์ฌ๋ฌ ๋ชจ๋ ์ค ์ด๋ฉ์ผ ํต์ ํฌํธ์ ์ ์ํ์ฌ ํ์ด์ฌ ์ฝ๋๋ก ์ด๋ฉ์ผ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ํ๋ ๋ชจ๋์ด ์๋๋ฐ, ๋ฐ๋ก SMTPlib (๋ฉ์ผ ๋ฐ์ ) ๊ณผ IMAPlib (๋ฉ์ผ ์์ ) ์ด๋ค. ์ด๋ฒ ๊ฒ์๊ธ์์๋ IMAP ์ ์ ์์ Python ์์์ IMAPlib ํ์ฉ๋ฒ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ํต์ ์ ํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด HTTP (hypertext transfer protocol) ์ด๋ผ๋ฉด, ๊ทธ๋ค์ด ์ด๋ฉ์ผ์ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ด ๋ฐ๋ก SMPT (Simple Mail Transfer Protocol) ๊ณผ IMAP (Internet Message Access Protocol) ์ด๋ค.
SMTP ๋?
์ด๋ฉ์ผ์ ์ ์กํ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ๋ก, ํด๋ผ์ด์ธํธ ๋๋ ์ธํฐ๋ท์์ ์๋ฒ๋ก ๋ฉ์ผ์ ์ ์กํ ๋ ์ฌ์ฉํ๊ฒ ๋๋ค.
IMAP ๋?
์ด๋ฉ์ผ์ ์์ ํ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ๋ก, ์๋ฒ์ ์ง์ ์ ์ํ์ฌ ๋ฉ์ผ์ ํ์ธํ๋ ๋ฐฉ์์ด๋ค. ๋ ๋ค๋ฅธ ์์ ํ๋กํ ์ฝ์ธ POP3 ์ ๋น๊ตํ์์ ๋ ์ง์ ํ์ธํ๊ณ ์ ํ๋ ๋ฉ์ผ์ ํด๋ฆญํด์ผ๋ง ๋ฉ์ผ ๋ด์ฉ์ ๋ค์ด๋ก๋ ํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์์ผ๋, ์คํ๋ผ์ธ ์ํ์์๋ ํ์ธํ ์ ์๋ค๋ ์ ๊ณผ ๋ค์ ๋ง์ ์ฉ๋์ ์ฐจ์งํ ์ ์๋ค๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์๋ค.
Python ์ Imaplib
Python ์์ IMAP ์๋ฒ์ ์ ์ํ์ฌ ์ด๋ฉ์ผ์ ์ฝ๊ณ ์ ํ๋ค๋ฉด ์ฐ์ imaplib ๋ชจ๋์ ์ค์นํด์ฃผ์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ์ด์ฌ ํ์ผ ์๋จ์
import imaplib
๋ฅผ ์คํํด์ค๋ค.
์ดํ ์ ์ํ๊ณ ์ ํ๋ IMAP ์๋ฒ๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋ ์ฐ๋ฆฌ๊ฐ ํํ ์๊ฐํ๋ ์ด๋ฉ์ผ ๋ก๊ทธ์ธ ๊ณผ์ ๊ณผ ๋์ผํ๋ค. ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ์๋ก ์์ฑํ์ฌ ์ ๋ ฅํด์ฃผ๋ฉด ๋ชฉํ์ ์ ์ ์ํ๊ฒ ๋๋ค.
user = 'something@gmail.com'
password = 'asdfasdfasdfasdf'
imap = imaplib.IMAP4_SSL("imap.gmail.com")
imap.login(user, password)
์์์ ์ฃผ์ํ ์ ์ gmail ์๋ฒ์ ์ ์ํ ๊ฒฝ์ฐ, 2๋จ๊ณ ๋ณด์ ์ธ์ฆ์ ๊ฑฐ์ณ ์์ฑํ 16์๋ฆฌ ์ฑ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. gmail ์ ๋ณด์ ๋ฌธ์ ๋ก, ์ ์ ๊ฐ ์ฌ์ ์ ๋ฑ๋กํ ๊ธฐ๊ธฐ ์ด์ธ์ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์ ์ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ์ธ์ฆ ์ ์ฐจ๋ฅผ ๋ฐ๊ฒ ํ๋ค. ๊ทธ๋ฌ๋ ํด๋น ์ ์ฐจ๊ฐ ๊น๋ค๋กญ๊ธฐ๋ ํ ๋ฟ๋๋ฌ ๋ฐ๋ณต์ ์ผ๋ก ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ ๊ฒฝ์ฐ ๋งค๋ฒ ์๋ก์ด ๋ก๊ทธ์ธ ์ ๋ณด๋ก ์ธ์๋๊ธฐ ๋๋ฌธ์ ๋น์ ์์ ์ธ ์ ์์ผ๋ก ๊ฐ์ฃผ๋์ด ์๋ฒ๊ฐ ๋ซํ ์ ์๋ค. ๋ฐ๋ผ์ ์ ์ ๊ฐ ์๋ก์ด ์ฑ์์๋ ์ ์ํ ์ ์๋๋ก ํ๋ ์ฑ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ฉํ๋ฉด, ํ์ด์ฌ ์ฝ๋๋ฅผ ํตํด์๋ ๋ก๊ทธ์ธํ ์ ์๊ฒ ๋๋ค.
์ดํ ์ด๋ฉ์ผ์ ๋ถ๋ฌ๋ค์ด๊ณ ์ ํ๋ ๋ฉ์ผํจ์ ์ ํํด์ฃผ๋ฉด ๋๋๋ฐ, ๋ฉ์ผํจ ๋ชฉ๋ก์ imap ๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์๋ค.
imap.select("INBOX")
๋ฉ์ผํจ๊น์ง ์ ํํด ์ฃผ์๋ค๋ฉด ์ํ๋ ์กฐ๊ฑด์ ์ ํํ์ฌ ์ฝ๊ณ ์ ํ๋ ๋ฉ์ผ์ ํํฐ๋งํด์ฃผ๋ฉด ๋๋ค. ๋ฉ์ผ์๋ ๊ณ ์ ํ uid ๊ฐ ๋ถ์ฌ๋๋๋ฐ, ์ ํํ ๋ฉ์ผ์ uid ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
status, messages = imap.uid('search', None, '(FROM "somewhere@naver.com")')
messages = messages[0].split()
์์ ์ฝ๋์ ๊ฒฝ์ฐ, ('OK', [b'00001 00002 .....']) ๋ฑ๊ณผ ๊ฐ์ tuple ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ฉฐ, ๋ ๋ฒ์งธ ๋ฐํ ์ธ์์ธ ๋ฐฐ์ด์ messages ๋ณ์์ ๋ด์ ๋ค์ ํ ๋ฒ ๊ฐ๋ณ uid ์ ์งํฉ์ธ ๋ฐฐ์ด๋ก ๋๋์ด ์ฃผ์๋ค.
์ดํ ์ํ๋ ๋ฉ์ผ์ uid ๋ฅผ ์ ํํ์ฌ ํด๋น ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋๋ค. ์ด ๋ uid ์์ ๋ค์ด๊ฐ๋ ๋ด์ฉ์ recent ๋ง๊ณ ๋ ๊ณ ์ ๋ ๊ฐ์ด๋ค (์ธ์ฝ๋ฉ ๊ด๋ จ).
recent = messages[-1]
res, msg = imap.uid('fetch', recent, "(RFC822)")
์ฌ๊ธฐ๊น์ง ์คํํ ๋ค print ๋ฌธ์ผ๋ก msg ๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ๋ฉ์ผ์ ํค๋๋ถํฐ ๋ณธ๋ฌธ์ด ํ์ฑ๋๊ธฐ ์ด์ ์ํ๋ก ์ญ ํผ์ณ์ง ๊ฒ์ด๋ค.
์์ง ์ ์ ๋์ง ์์ ๋ฉ์ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ์ํด์๋ ์ถ๊ฐ ์์ ์ด ํ์ํ๋ค.
์ง์ ๋์ผ๋ก ํ์ธํ๊ธฐ๋ ์ด๋ ต์ง๋ง ์์ ํ์๋ ๋ฉ์ผ ์ ๋ณด๋ ๋ฐฐ์ด ํํ๋ก ์ ์ฅ๋์ด ์๋ค. ๋ฐ๋ผ์ ๋ฉ์ผ ํ์ธ์ ์ํด ํ์ํ ์ ๋ณด๋ง์ ๋ฐ๋ก ์ถ์ถํ ๋ค, ํด๋น ๋ด์ฉ์ ๋์ฝ๋ฉํด์ผ ํ๋ค.
raw = msg[0][1].decode('utf-8')
๋์ฝ๋ฉ ํจ์ ๋ด๋ถ์ 'utf-8'์ ์ฌ์ฉํด์ค์ผ๋ก์จ ์ฌ๋์ด ์ฝ์ ์ ์๋ ์บ๋ฆญํฐ๋ก ๋ณํ์ ํด์ฃผ๊ฒ ๋๋ค.
์ด์ ์๋ก์ด ๋ชจ๋์ ํ์ฉํ ๋๊ฐ ๋์๋๋ฐ, ํ์ด์ฌ์ ๋ด์ฅ๋์ด ์๋ email ๋ชจ๋์ด๋ค. ํด๋น ๋ชจ๋์ ํ์ด์ฌ์์ email ๊ฐ์ฒด๋ฅผ ์์ ์์ฌ๋ก ์ฌ์ฉํ๋๋ก ๋์์ค๋ค. ์์ ๋์ฝ๋ฉํ ๋ด์ฉ์ด ์ด์ ์์ด ๋๋ ํ๊ตญ์ด๋ก ๋ณํ๋๊ธฐ๋ ํ์ง๋ง ์ด๋ฉ์ผ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณธ๋ฌธ๋ง, ๋๋ ์์ ์ธ/๋ฐ์ ์ธ๋ง ๋ฐ๋ก ์ถ์ถํด๋ณด๊ธฐ ์ด๋ ค์ด ์ํ์ด๋ค. ์ด๋ฅผ ์์ํ๊ฒ ๋ณผ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
import email
email_message = email.message_from_string(raw)
email_message ๋ email ๊ฐ์ฒด์ด๋ฉฐ, ์ด์ email ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ํค๋ฅผ ํตํด ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๊ฒ ๋๋ค. ๋ฟ๋ง ์๋๋ผ ๋ด์ฅ ๋ฉ์๋๋ฅผ ํตํด ๋ณธ๋ฌธ, ๋ณธ๋ฌธ ํ์ , ํค๋ ๋ฑ ์ฌ๋ฌ ์์๋ค์ ํ์ธํ ์ ์๋ค.
email_message['To'] // ์์ ์ธ
email_message['From'] // ๋ฐ์ ์ธ
email_message['Subject'] // ์ ๋ชฉ
body = email_message.get_payload(decode=True).decode()
์์ ๊ฐ์ด imaplib ๋ชจ๋์ ์ฌ์ฉํ์ฌ, ์ด๋ฉ์ผ์ ์ฝ์ด์ฃผ๋ ๊ฐ๋จํ ํ์ด์ฌ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์์ฑ๋ณธ
python ์ imaplib ์ ์ฐพ์๋ณด๊ฒ ๋ ๊ณ๊ธฐ๋ ์๋ํ์ ๋ํ ์์ฌ๊ณผ ๋ฐ๋ณต์์ ์ ๋นํจ์จ์ฑ์ ๋ํ ๊ท์ฐฎ์์ด์๋ค. ๋ชฉํํ ์์ ์ ํ์ด ํ๊ฐ (๋ฆฌ๋ทฐ) ๋ฉ์ผ์ ์ ๋ถ ๊ธ์ด์, ๋ณด๊ธฐ ์ข์ ํํ๋ก ์ ์ ํ๊ณ , ํ ๋์ ๋ณผ ์ ์๋๋ก csv ํ์ผ์ ์ ์ฅํ๋ ๊ฒ์ด์๋ค.
์ด๋ฅผ ์ํด re (์ ๊ทํํ์ ํ์ฉ ๋ชจ๋), csv (csv ํ์ผ ํ์ฉ ๋ชจ๋), os (์ด์์ฒด์ ํ์ฉ ๋ชจ๋), dotenv (ํ๊ฒฝ๋ณ์ ํ์ฉ ๋ชจ๋) ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ํ์ํ ๋ชจ๋์ ์ถ๊ฐ๋ก ์ค์นํ ๋ค, ์ฉ๋์ ๋ง๊ฒ ํ์ํ ๋ฉ์ผ์ csv ํ์ผ์ ์ ์ฅํด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๋ํ ์์ ์์ ๋ง์ผ๋ก๋ ํ๊ตญ์ด๋ฅผ ํ์ฑํ๋ ๋ฐ ๋ถ์ถฉ๋ถํ์ฌ ํ๊ตญ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ์์ ์ ์คํํ๋ค.
from email.header import decode_header
from datetime import datetime
import imaplib, re, csv, email
import os
from dotenv import load_dotenv
# ์ ์ฅํ csv ํ์ผ ๋ง๋ค๊ธฐ
f = open('pair_feedback.csv', 'w', newline='')
write = csv.writer(f)
write.writerow(['#', '๋ ์ง', 'ํ์ด', '์คํ๋ฆฐํธ', '์ํ ์ ', '๊ฐ์ ํ ์ '])
# ์ ์ ๊ฐ์ธ์ ๋ณด (ํ๊ฒฝ๋ณ์ ์ค์ )
load_dotenv()
user = os.environ.get('mail') # ์ด๋ฉ์ผ ์ฃผ์ (ex. abcde@gmail.com)
password = os.environ.get('password') # ์ฑ ๋น๋ฐ๋ฒํธ (16์๋ฆฌ)
# IMAP ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ
imap = imaplib.IMAP4_SSL("imap.gmail.com")
imap.login(user, password)
# ์ ๊ทผํ๊ณ ์ ํ๋ ๋ฉ์ผํจ ์ด๋ฆ
imap.select("INBOX")
# status = ์ด๋ฉ์ผ ์ ๊ทผ ์ํ
# messages = ์ ํํ ์กฐ๊ฑด์ ํด๋นํ๋ ๋ฉ์ผ์ id ๋ชฉ๋ก
# ('OK', [b'00001 00002 .....'])
status, messages = imap.uid('search', None, '(FROM "notifications@typeform.com")')
messages = messages[0].split()
# ๊ฐ ๋ฉ์ผ์ ๋ํ์ฌ ์คํ
for n, message in enumerate(messages):
print(f"Writing email #{n} on file...")
# Standard format for fetching email message
res, msg = imap.uid('fetch', message, "(RFC822)")
raw = msg[0][1]
# type(email_message) == <class 'email.message.Message'>
email_message = email.message_from_bytes(raw)
# decode 'subject' info (๋ฉ์ผ ์ ๋ชฉ)
subject, encoding = decode_header(email_message["Subject"])[0]
subject = subject.decode(encoding) # ํ๊ตญ์ด๋ก ๋์ฝ๋ฉํ๋ ์์
if 'Pair Review' in subject:
# decode 'date' (๋ ์ง) & format
# date = 'Thu, 08 Apr 2021 05:10:04 +0000'
temp, _ = decode_header(email_message.get("Date"))[0]
temp = datetime.strptime(temp, '%a, %d %b %Y %H:%M:%S %z')
date = temp.strftime('%Y๋
%m์ %d์ผ')
# subject ์์ ํ์ด ์ด๋ฆ ์ถ์ถ
match = re.search(r'[๊ฐ-ํฃ]+๋์', subject) # 'ใ
ใ
ใ
๋์' ๋ฌธ์์ด ์ถ์ถ
pair = match.group() # ๋งค์น๋ ๋ฌธ์์ด ๋ฐ์์ pair ๋ณ์์ ํ ๋น
pair = pair[:-2] # ์ด๋ฆ๋ง ๋จ๋๋ก ์ฌ๋ผ์ด์ฑ
# get mail body (๋ฉ์ผ ๋ณธ๋ฌธ)
# email_message.get_content_type() == 'text/html'
body = email_message.get_payload(decode=True).decode()
body = body[:body.rindex('<br/>')].replace('<br/>', ' ')
# ๋ณธ๋ฌธ (body) ์ ์์์ ๋ถํฐ ๋ง์ง๋ง <br/> ์ด ๋ฑ์ฅํ๋ ์ง์ ๊น์ง ์ถ์ถ ํ, ๋ชจ๋ <br/> ์ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด
# body ์์ Sprint ๋ด์ฉ ์ถ์ถ
match = re.search(r'\[[\D]+\]', body)
# ๋๊ดํธ ์์ด Whitespace ๊ฐ ์๋ ๊ฐ (์ : '[JS/Node]') ์ฐพ๊ธฐ
sprint = match.group() # ๋งค์น๋ ๋ฌธ์์ด ๋ฐ์์ sprint ๋ณ์์ ํ ๋น
# body ์์ ์ํ ์ , ๊ฐ์ ํ ์ ๋ด์ฉ ์ถ์ถ
# ํ๊ธ ์ด๋ฆ + ๊ธฐ์กด ๋ฌธ์ฅ ๋ด์ฉ (์ : '๊น์ฝ๋ฉ๋์ด ํ๊ฐํ ๋ฐํด์ปค๋์ ์ํ ์ :')
match = re.search(r'[๊ฐ-ํฃ]+๋์ด\sํ๊ฐํ\s[๊ฐ-ํฃ]+๋์\s์ํ\s์ :', body)
# '...์ํ ์ :' ๋ฌธ์์ด์ ์์๊ณผ ๋ ์ธ๋ฑ์ค ์ถ์ถ
start_awesome, end_awesome = match.span()
# ํ๊ธ ์ด๋ฆ + ๊ธฐ์กด ๋ฌธ์ฅ ๋ด์ฉ (์ : '๊น์ฝ๋ฉ๋์ด ํ๊ฐํ ๋ฐํด์ปค๋์ ๊ฐ์ ํ๋ฉด ์ข์ ์ :')
match = re.search(r'[๊ฐ-ํฃ]+๋์ด\s์๊ฐํ\s[๊ฐ-ํฃ]+๋์\s๊ฐ์ ํ๋ฉด\s์ข์\s์ :', body)
# '...๊ฐ์ ํ๋ฉด ์ข์ ์ :' ๋ฌธ์์ด์ ์์๊ณผ ๋ ์ธ๋ฑ์ค ์ถ์ถ
start_improve, end_improve = match.span()
awesome = body[end_awesome:start_improve]
improve = body[end_improve:]
# csv ํ์ผ์ ์ ์ฅํ ๋ด์ฉ ์ฐ๊ธฐ
write.writerow([n, date, pair, sprint, awesome, improve])
print("All complete!")
f.close()
imap.close()
imap.logout()
๊ทธ ๊ฒฐ๊ณผ, ๋ฉ์ผ๋ก ๋ค์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์
์ด๋ ๊ฒ ์ ๋ฆฌ๋ csv ํ์ผ ํํ๋ก ๋ณผ ์ ์๊ฒ ๋์๋ค!!
ํด๋น ํ๋ก์ ํธ์ ์ ์ฒด ์ฝ๋์ ๊ตฌ์ฒด์ ์ธ README ๋ ์๋์ github ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธํ ์ ์๋ค.
https://github.com/vodkamitlime/pair_review
vodkamitlime/pair_review
Contribute to vodkamitlime/pair_review development by creating an account on GitHub.
github.com
๋ค์ ๋ชฉํ๋ ํด๋น ์ฝ๋๋ฅผ fastApi ํ๋ ์์ํฌ์ ์ ํ ์น์์ ๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฉ์ผ ์ ๋ณด๊ฐ ๋ด๊ธด csv ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ฒ ํด์ฃผ๋ ๊ฒ์ธ๋ฐ, ์ธ์ฆ ๋ถ๋ถ์ ์์ง ๋ฐฐ์ฐ์ง ๋ชปํด ์ฑ๊ณตํ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ๋ค. ๊ทธ๋ฌ๋ ๋์ ์ ์ธ์ ๋ ์ฌ๋ฏธ์๋ ์ผ์ด๋ ์กฐ๋ง๊ฐ ์๋ํด๋ณด๋ ค ํ๋ค.
'๐ป DEV > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] sort() ํจ์์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ (0) | 2020.12.22 |
---|
๋๊ธ