์ธ๊ณต์ง๋ฅ์ ์ํ ํ์ด์ฌ - ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ
BoostCamp AI Tech
Python
log
regex
XML
csv
JSON
01/22/2021
๋ณธ ์ ๋ฆฌ ๋ด์ฉ์ Naver BoostCamp AI Tech์ edwith์์ ์๊ฐํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ฒ์
๋๋ค.
์ฌ์ค๊ณผ ๋ค๋ฅธ ๋ถ๋ถ์ด ์๊ฑฐ๋, ์์ ์ด ํ์ํ ์ฌํญ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์.
Python์ผ๋ก ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ
Exception Handling
Exception์ด๋?
- ์์ ๊ฐ๋ฅํ ์์ธ
- ๋ฐ์ ์ฌ๋ถ๋ฅผ ์ฌ์ ์ ์ธ์งํ ์ ์๋ ์์ธ์ด๋ค.
- ์ฌ์ฉ์๊ฐ ์๋ชป๋ ์ ๋ ฅ์ ํ๊ฑฐ๋, ํ์ผ์ ํธ์ถํ์๋๋ฐ ํ์ผ์ด ์์ ๊ฒฝ์ฐ
- ๊ฐ๋ฐ์๊ฐ ๋ฐ๋์ ๋ช ์์ ์ผ๋ก ์ ์ํด์ผํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก
if
๋ฅผ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ
- ์์ ๋ถ๊ฐ๋ฅํ ์์ธ
- ์ธํฐํ๋ฆฌํฐ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์์ธ๋ก, ๊ฐ๋ฐ์์ ์ค์๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ๋ฆฌ์คํธ์ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ ๊ฐ์ ํธ์ถ(out of range), ์ ์ 0์ผ๋ก ๋๋(division by zero)
- ์ํ ๋ถ๊ฐ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ์๋ ํธ์ถํ๋ค.
๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์์ธ์ ๊ดํ์ฌ Exception Handling์ ์ฒ๋ฆฌํด์ฃผ์ด์ผํ๋ค.
Python์ Built-in Exception
<์์ฃผ ๋์ค๋ Exception>
Exception ์ด๋ฆ | ๋ด์ฉ |
---|---|
IndexError | List์ Index ๋ฒ์๋ฅผ ๋์ด๊ฐ ๋ |
NameError | ์กด์ฌํ์ง ์์ ๋ณ์๋ฅผ ํธ์ถ ํ ๋ |
ZeroDivisionError | 0์ผ๋ก ์ซ์๋ฅผ ๋๋ ๋ |
ValueError | ๋ณํํ ์ ์๋ ๋ฌธ์/์ซ์๋ฅผ ๋ณํํ ๋ |
FileNotFoundError | ์กด์ฌํ์ง ์๋ ํ์ผ์ ํธ์ถํ ๋ |
Python์ ์์ธ์ฒ๋ฆฌ
try
~except
๋ฌธ๋ฒif
๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ง๋ง,try
~except
๋ฅผ ๊ถ์ฅํ๋ ์ํฉ์ด ์๋ค.Python์์๋
if
๋ ๋ก์ง์ ํํ๋ฅผ ์ฒ๋ฆฌํ ๋,try
~except
๋ ์ฌ์ฉ์์ ์๋ชป๋ ์ฌ์ฉ์ผ๋ก ์ธํ ์์ธ์ํฉ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.PYTHONtry:์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋except <Exception Type>:์์ธ ๋ฐ์์ ๋์ํ๋ ์ฝ๋
try
~except
~else
์ก์ ์์ธ๊ฐ ์์ ๊ฒฝ์ฐ
else
๋ฌธ์ ์ํํ๋ค.PYTHONtry:์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋except <Exception Type>:์์ธ ๋ฐ์์ ๋์ํ๋ ์ฝ๋else:์์ธ๊ฐ ๋ฐ์ํ์ง ์์ ๋ ๋์ํ๋ ์ฝ๋
try
~except
~finally
์์ธ๋ฅผ ์ก์๋์ง์ ๊ด๊ณ ์์ด
finally
๊ตฌ๋ฌธ์ ์ํํ๋ค.PYTHONtry:์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋except <Exception Type>:์์ธ ๋ฐ์์ ๋์ํ๋ ์ฝ๋finally:์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ์คํ๋จ
raise
=>raise <Exception Type>(์์ธ์ ๋ณด)
ํน์ ์์ธ๋ฅผ ๊ณ ์์ ์ผ๋ก ๋ฐ์์ํจ๋ค.
PYTHONwhile True:value = input("๋ณํํ ์ ์ ๊ฐ์ ์ ๋ ฅํด์ฃผ์ธ์")for digit in value:if digit not in "0123456789":raise ValueError("์ซ์๊ฐ์ ์ ๋ ฅํ์ง ์์ผ์ จ์ต๋๋ค")print("์ ์๊ฐ์ผ๋ก ๋ณํ๋ ์ซ์ -", int(value))
assert ์์ธ์กฐ๊ฑด
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
์ต๊ทผ์๋ type hinting ๋๋ฌธ์ ์ฌ์ฉ๋น๋๊ฐ ์กฐ๊ธ ์ค์ด๋ค์๋ค.
PYTHONdef get_binary_number(decimal_number):assert isinstance(decimal_number, int)return bin(decimal_number)print(get_binary_number(10))
File Handling
ํ์ผ์ ์ข ๋ฅ
๊ธฐ๋ณธ์ ์ธ ํ์ผ ์ข ๋ฅ๋ text ํ์ผ๊ณผ binary ํ์ผ๋ก ๋๋์ด์๋ค.
์ปดํจํฐ๋ textํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด binary ํ์ผ๋ก ๋ณํ์ํจ๋ค. Python์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ .py
ํ์ผ๋ค์ ํ
์คํธํ์ผ์ด๋ฏ๋ก, Cpython
์ ์ด์ฉํ์ฌ binary ํ์ผ์ธ .pyc
ํ์ผ๋ก ๋ณํ๋๋ค.
์ฌ์ค, ๋ชจ๋ text ํ์ผ๋ ์ค์ ๋ก๋ binary ํ์ผ์ด์ง๋ง, ASCII/Unicode ๋ฌธ์์ด ์งํฉ์ผ๋ก ์ ์ฅ๋์ด์ ์ฌ๋๋ค์ด ์ฝ์ ์ ์๋๋ก ๋ณํ๋์ด ๋ณด์ฌ์ง ๋ฟ์ด๋ค.
Binary ํ์ผ | Text ํ์ผ |
---|---|
์ด์ง๋ฒ ํํ๋ก ์ ์ฅ๋ ํ์ผ | ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋ ํ์ผ |
์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ์ฅ์ ์ด๋ฉด ๋ด์ฉ์ด ๊นจ์ ธ ๋ณด์ | ๋ฉ๋ชจ์ฅ์ผ๋ก ์ด์ด ๋ด์ฉ ํ์ธ ๊ฐ๋ฅ |
Excel ํ์ผ, ์๋ํ์ผ ๋ฑ ์ดํ๋ฆฌ์ผ์ด์ ์ข ์ ํ์ผ | ๋ฉ๋ชจ์ฅ์ ์ ์ฅ๋ ํ์ผ, HTML ํ์ผ, .py ํ์ผ ๋ฑ |
File Write
- mode
w
: (๋ฎ์ด)์ฐ๊ธฐ๋ชจ๋a
: ์ถ๊ฐ ๋ชจ๋
- ํ๊ธ ๋ฑ์ ๋ฃ์ผ๋ ค๋ฉด
encoding
์ต์ ์ ๋ฃ์ด์ผ ํจ(utf-8)
with open("count_log.txt", "a", encoding="utf8") as f: for i in range(1, 11): data = f"{i}๋ฒ์งธ ์ค์
๋๋ค.<br>" f.write(data)
Directory ๋ค๋ฃจ๊ธฐ
os
๋ชจ๋์ ์ด์ฉํ์ฌ Directory๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
import osos.mkdir("log") #ํด๋น ๋๋ ํ ๋ฆฌ์ "log" ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค# Exception Handling๊ณผ๋ ํจ๊ป ์ฌ์ฉํ ์ ์๋คtry: os.mkdir("abc")except FileExistsError as e: print("Already created")os.path.exists("abc") # abc๋ผ๋ ํด๋๊ฐ ์๋์ง ํ์ธํ๊ณ Boolean๊ฐ ๋ฐํ# ํ์ผ์ ์ฎ๊ธธ๋import shutilsource = "I_have_a_dream.txt"dest = os.path.join("abc", "log.txt") # ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ํฉ์ณ ๋ฌธ์์ด๋ก ์ ์ฅshutil.copy(source, dest) # abc/log.txt# ์ต๊ทผ์๋ path๋ฅผ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๋ pathlib ๋ชจ๋์ ๋ ๋ง์ด ์ฌ์ฉํ๋ ํธ.import pathlibcwd = pathlib.Path.cwd() # current working directory, ํ์ฌ ๋๋ ํ ๋ฆฌlist(cwd.parent) # ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ถ๋ชจ ๋๋ ํ ๋ฆฌ ๋ด์ฉ๋ฌผ ๋ฆฌ์คํธํ
Pickle
Python์ ๊ฐ์ฒด๋ ์์ฑ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ค๊ฐ, ์ธํฐํ๋ฆฌํฐ๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ๋ด๋ ค์ค๊ฒ(์ฌ๋ผ์ง๊ฒ)๋๋ค.
Pickle
์ ์ด์ฒ๋ผ ์ผ์์ ์ธ Python์ ๊ฐ์ฒด๋ฅผ ์์ํ(persistence)ํ๋ built-in ๊ฐ์ฒด๋ก, Python์ ํนํ๋ binary ํ์ผ์ด๋ค.
๋ฐ์ดํฐ, object ๋ฑ ์คํ ์ค ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ์ธํฐํ๋ฆฌํฐ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค.
์ ์ฅํด์ผํ๋ ์ ๋ณด, ๊ณ์ฐ ๊ฒฐ๊ณผ(๋ชจ๋ธ) ๋ฑ ํ์ฉ ๋ฐฉ๋ฒ์ด ๋ค์ํ๋ค.
import picklef = open("list.pickle", "wb")test = [1,2,3,4,5]pickle.dump(test, f)f.close()del test # ๋ฉ๋ชจ๋ฆฌ์์ ๋ฆฌ์คํธ ์ญ์ # print(test) # ์๋ฌ ์ถ๋ ฅf = open("list.pickle", "rb)test_pickle = pickle.load(f) # ์ญ์ ํ๋ ๋ฆฌ์คํธ binary ๋ก๋ ๊ฐ๋ฅprint(test_pickle)f.close()
Log Handling
Logging, ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ผ์ด๋๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ก์ผ๋ก ๋จ๊ธฐ๋ ๊ฒ์ logging์ด๋ผ๊ณ ํ๋ค.
Log๋ก ๋จ๊ธธ ๊ฒ๋ค
- ์ ์ ์ ๊ทผ ๊ธฐ๋ก, ํ๋ก๊ทธ๋จ์ Exception, ํน์ ํจ์ ์ฌ์ฉ ๊ธฐ๋ก ๋ฑ
Log๋ฅผ ์ ์ฅํ ์์น
- Console ํ๋ฉด, ํ์ผ, DB ๋ฑ
์ด ๋, Log๋ ์คํ ์์ ์์ ๋จ๊ฒจ์ผ ํ๋ ๊ธฐ๋ก๊ณผ ๊ฐ๋ฐ์์ ์์ ๋จ๊ฒจ์ผ ํ๋ ๊ธฐ๋ก ๋ฑ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ์ฅ๋๋ค.
print์ logging์ ์ฐจ์ด
๊ธฐ๋ก์ print
๋ก ๋จ๊ธฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, console ์ฐฝ์๋ง ๋จ๋ ๊ธฐ๋ก์ ๋ถ์์ ์ํด ์ฌ์ฉํ ์ ์๋ค.
๋ํ, ๋๋ก๋ level๋ณ(develop, production)๋ก ๊ธฐ๋ก์ ๋จ๊ธธ ํ์๋ ์์ผ๋ฉฐ, ๋ชจ๋ ๋ณ๋ก ๋ณ๋์ logging์ ๋จ๊ธธ ํ์๋ ์๋ค.
์ด์ฒ๋ผ ๋ค์ํ ์ํฉ์ ๊ธฐ๋ก์ ์ฒด๊ณ์ ์ผ๋ก ์ง์ํ๋ ๋ชจ๋์ด ํ์ํ๊ธฐ๋๋ฌธ์ logging
๋ชจ๋์ด ์ฌ์ฉ๋๋ค.
logging ๋ชจ๋
Python์ ๊ธฐ๋ณธ Log๊ด๋ฆฌ ๋ชจ๋์ด๋ค.
DEBUG > INFO > WARNING > ERROR > CRITICAL ์์ค์ผ๋ก ๋ก๊ทธ ๋ ๋ฒจ์ด ๋ฌ๋ผ์ง๋ค.
import logginglogging.debug("๋๋ฒ๊ทธ ์ ๋ณด")logging.info("์ ๋ณด ์ ๊ณต")logging.warning("Exception ์์ค์ ๊ฒฝ๊ณ , ์ฃผ์")logging.error("Exception ์์ค์ ์๋ฌ ๋ณด๊ณ ")logging.critical("ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์์ค์ ์๋ฌ ๋ณด๊ณ ")
Level | ๊ฐ์ | ์์ |
---|---|---|
debug | ๊ฐ๋ฐ์ ์ฒ๋ฆฌ ๊ธฐ๋ก์ ๋จ๊ฒจ์ผ ํ๋ ๋ก๊ทธ ์ ๋ณด๋ฅผ ๋จ๊น | ๋ค์ ํจ์๋ก A๋ฅผ ํธ์ถํจ, ๋ณ์ A๋ฅผ ๋ฌด์์ผ๋ก ๋ณ๊ฒฝํจ |
warning | - ์ฌ์ฉ์๊ฐ ์๋ชป ์
๋ ฅํ ์ ๋ณด - ํน์ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ ๊ฐ๋ฐ๊ณผ์ ์์ ์๋์น ์์๋ ์ ๋ณด๊ฐ ๋ค์ด์์ ๋ | - Str ์
๋ ฅ์ ๊ธฐ๋ํ์ผ๋, Int ์
๋ ฅโ Str casting์ผ๋ก ์ฒ๋ฆฌ - ํจ์์ argument๋ก ์ด์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๊ธฐ๋ํ์ผ๋, ์ผ์ฐจ์ ๋ฆฌ์คํธ๊ฐ ๋ค์ด์ด โ์ด์ฐจ์์ผ๋ก ๋ณํ ํ ์ฒ๋ฆฌ |
info | ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ ๋์์ ์ ๋ณด๋ฅผ ์๋ฆผ | - ์๋ฒ๊ฐ ์์๋์์ - ์๋ฒ๊ฐ ์ข ๋ฃ๋จ - ์ฌ์ฉ์ A๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ํจ |
error | ์๋ชป๋ ์ฒ๋ฆฌ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฌ์ผ๋, ํ๋ก๊ทธ๋จ์ ๋์ํ ์ ์์์ ์๋ฆผ | - ํ์ผ์ ๊ธฐ๋ก์ ํด์ผ ํ๋๋ฐ ํ์ผ์ด ์์ โ Exception ์ฒ๋ฆฌ ํ ์ฌ์ฉ์์๊ฒ ์๋ฆผ - ์ธ๋ถ์๋น์ค์ ์ฐ๊ฒฐ๋ถ๊ฐ |
critical | ์๋ชป๋ ์ฒ๋ฆฌ๋ก ๋ฐ์ดํฐ ์์ค์ด๋ ๋์ด์ ํ๋ก๊ทธ๋จ์ด ๋์ํ ์ ์์์ ์๋ฆผ | - ์๋ชป๋ ์ ๊ทผ์ผ๋ก ํด๋น ํ์ผ์ด ์ญ์ ๋จ - ์ฌ์ฉ์์ ์ํ ๊ฐ์ ์ข ๋ฃ |
Logging ์ค์ ๋ฒ
configparser
: ํ์ผ์ ์ค์ ํ๋ ๋ฐฉ์- ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์ file์ ์ ์ฅํ๋ค.
- Section, Key, Value ๊ฐ์ ํํ๋ก ์ค์ ๋ ์ค์ ํ์ผ์ ์ฌ์ฉํ๋ค.
- ์ค์ ํ์ผ์ Dict Type์ผ๋ก ํธ์ถ ํ ์ฌ์ฉํ ์ ์๋ค.
PYTHON# config file(.cfg)[SectionOne] # section์ ๋๊ดํธName : Alphaca # ์์ฑ์ Key, ValueAge : 25Address : Seoul[SectionTwo]FavoriteSinger = Beenzino[SectionThree]FavoriteSong = AlwaysAwakePYTHON# configparser fileimport configparserconfig = configparser.ConfigParser()config.sections()config.read('example.cfg')config.sections() # ['SectionOne', 'SectionTwo', 'SectionThree']for key in config['SectionTwo']:print(key) # FavoriteSingerconfig['SectionOne']['Age']argparser
: Console์ฐฝ์์ ํ๋ก๊ทธ๋จ ์คํ์ Setting ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์- ๊ฑฐ์ ๋ชจ๋ Console ๊ธฐ๋ฐ Python ํ๋ก๊ทธ๋จ์ด ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๊ณ ์๋ค.
- ํน์ ๋ชจ๋๋ ๋ง์ด ์กด์ฌํ์ง๋ง(TF), ์ผ๋ฐ์ ์ผ๋ก
argparser
๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. - Command-Line Option์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค
- ํฐ๋ฏธ๋์์ ๋ถ์ด๋
-h
,--help
๊ฐ์ ์ต์ ๋ค๋argparser
์ ์์
- ํฐ๋ฏธ๋์์ ๋ถ์ด๋
PYTHONimport argparseparser = argparse.ArgumentParser(description='Sum two integers.')# ์ธ์๋ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก <์งง์์ด๋ฆ>, <๊ธด ์ด๋ฆ>, <ํ์๋ช >, <Help ์ค๋ช >, <arg ํ์ >parser.add_argument('-a', '--a_value', dest='A_value', help='A integers', type=int)args = parser.parse_args()print(args) # Namespace(a=์ ๋ ฅ๊ฐ)print(args.a) # ์ ๋ ฅ๊ฐ
Python Data Handling
CSV, Comma Separate Values
ํ๋๋ฅผ ์ผํ(,)๋ก ๊ตฌ๋ถํ ํ ์คํธ ํ์ผ๋ก,
์ก์ ์์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ก๊ทธ๋จ์ ์๊ด์์ด ์ฐ๊ธฐ ์ํ ๋ฐ์ดํฐ ํ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
์ผํ ๋์ ํญ(TSV), ๋น์นธ(SSV) ๋ฑ์ผ๋ก ๊ตฌ๋ถํด์ ๋ง๋ค์ด์ง๋ variation์ด ์๊ณ , ์ด ๋ชจ๋ ๊ฒ์ ํต์นญํ์ฌ **character-separated values(CSV)**
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ผ๋ฐ์ ์ธ Text File handling์ฒ๋ผ, ํ์ผ์ ๋ถ๋ฌ์ ๋ฌธ์์ด์ ์ฝ์ด์์ ์ฒ๋ฆฌํ ์๋ ์๊ฒ ์ง๋ง, ์ด ๊ฒฝ์ฐ ๋ฌธ์ฅ ๋ด์ ์ผํ(,)์ ๋ํด ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ csv ํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด python์์ csv ๋ชจ๋์ ์ ๊ณตํ๋ค.
import csvreader = csv.reader(f, delimeter=',', quotechar='"', quoting=csv.QUOTE_ALL)
Attribute | Default | Meaning |
---|---|---|
delimiter | , | ๊ธ์๋ฅผ๋๋๋ ๊ธฐ์ค |
lineterminator | \r\n | ์ค๋ฐ๊ฟ ๊ธฐ์ค |
quotechar | " | ๋ฌธ์์ด์ ๋๋ฌ์ธ๋ ์ ํธ๋ฌธ์ |
quoting | QUOTE_MINIMAL | ๋ฐ์ดํฐ ๋๋๋ ๊ธฐ์ค์ด quotechar์ ์ํด ๋๋ฌ์ธ์ธ ๋ ๋ฒจ |
CSV ๋ชจ๋์ ์์ธํ ์ฌ์ฉ๋ฒ์ ๋ํด์๋ Docs๋ฅผ ์ฐธ๊ณ ํ๋ค. ์ฌ์ค ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ ์ฝ๊ธฐ, ๋ถ๋ฆฌ ๊ธฐ๋ฅ ์ธ์๋ ํฌ๊ฒ ์ฌ์ฉํ ์ผ์ด ์๊ธด ํ๋ค.
์งํํ๋ฉด์ utf-8
๊ณผ unicode
์ ๊ฐ๋
์ด ํท๊ฐ๋ฆฐ๋ค๋ฉด ๋ค์ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํ์.
Unicode์ UTF-8 ๊ฐ๋จํ ์ดํดํ๊ธฐ
Web
WWW
== World Wide Web
== Web
, ์ค์ฌ์ ์น์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ ๋ฒ๋์ค๋ฆฌ์ ์ํด 1989๋ ์ฒ์ ์ ์๋์์ผ๋ฉฐ, ์๋๋ ๋ฌผ๋ฆฌํ์๋ค๊ฐ์ ์ ๋ณด ๊ตํ์ ์ํ ๊ฒ์ํ์ผ๋ก ์ฌ์ฉ๋์๋ค.
๋ฐ์ดํฐ ์ก์์ ์ ์ํ HTTP
ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ธฐ ์ํด HTML
ํ์์ ์ฌ์ฉํ๋ค.
Regular Expression, ์ ๊ท์
์ ๊ทํํ์์ ์๋ฏธํ๋ฉฐ, regexp
๋๋ regex
๋ฑ์ผ๋ก ์์ฃผ ๋ถ๋ฆฐ๋ค.
๋ณต์กํ ๋ฌธ์์ด ํจํด์ ์ ์ํ๋ ๋ฌธ์ ํํ ๊ณต์์ผ๋ก, ํน์ ํ ๊ท์น์ ๊ฐ์ง ๋ฌธ์์ด๋ค์ ์งํฉ์ ์ถ์ถํ ์ ์๋ค.
์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ, ์ ํ๋ฒํธ, ๋์ ISBN ๋ฑ ํ์์ด ์๋ ๋ฌธ์์ด์ ์๋ณธ ๋ฌธ์์ด๋ก๋ถํฐ ์ถ์ถํ๋ค.
HTML ์ญ์ tag๋ฅผ ์ฌ์ฉํ ์ผ์ ํ ํ์์ด ์กด์ฌํ๋ฏ๋ก, ์ ๊ท์์ผ๋ก ์ถ์ถํ๊ธฐ์ ์ข๋ค.
๋จ, ๋ฌธ๋ฒ ์์ฒด๊ฐ ๋งค์ฐ ๋ฐฉ๋ํ๋ฏ๋ก ํ์ํ ๋๋ง๋ค ์ค์ค๋ก ์ฐพ์์ ๊ณต๋ถํ๋๊ฒ์ด ์ข๋ค.
์ ๊ท์์ ํ ์คํธํด๋ณด๊ธฐ ์ข์ ์ฌ์ดํธ๋ก regexer.com์ด ์๋ค.
<๊ธฐ๋ณธ ๋ฌธ๋ฒ>
- ๋ฌธ์ ํด๋์ค
[ ]
:[
๊ณผ]
์ฌ์ด์ ๋ฌธ์๋ค๊ณผ ๋งค์น[abc]
: ํด๋น ๊ธ์๊ฐ a,b,c ์ค ํ๋์ด๋ค.- a, before, deep, dud, sunset
-
: ๋ฒ์ ์ง์ [a-zA-Z]
- ์ํ๋ฒณ ์ ์ฒด
- ๋ฉํ ๋ฌธ์
- ์ ๊ท์ ํํ์ ์ํด ์๋ ์๋ฏธ๊ฐ ์๋ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๋ฌธ์๋ค
.
: ์ค๋ฐ๊ฟ ๋ฌธ์์ธ<br>
์ ์ ์ธํ ๋ชจ๋ ๋ฌธ์์ ๋งค์น*
: ์์ ์๋ ๊ธ์๊ฐ 0๊ฐ ์ด์์ด๋ฉด ๋งค์นtomor*ow
- tomoow, tomorrow, , tomorrrrow
+
: ์์ ์๋ ๊ธ์๊ฐ 1๊ฐ ์ด์์ด๋ฉด ๋งค์นtomor+ow
- tomorow, tomorrrow
{m,n}
- ๋ฐ๋ณตํ์๋ฅผ ์ง์ , mํ ์ด์ nํ ์ดํ (n ์๋ต์ mํ ํ์ )?
: ์์ ๊ธ์ ๋ฐ๋ณต ํ์๊ฐ 1ํ|
: or^
: not
Python์์๋ re
๋ชจ๋์ ์ด์ฉํ์ฌ regex๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
# ํน์ URL์์ ์ํ๋ ๋ฌธ์์ด ํ์ฑํด์ค๊ธฐimport reimport urllib.requesturl = "https://url-path.com"html = urllib.request.urlopen(url)html_contents = str(html.read())id_results = re.findall(r"([A-Za-z0-9]+\*\*\*)", html_contents)for result in id_results: print(results)
XML
eXtensible Markup Language
์ ์ค๋ง๋ก, ๋ฐ์ดํฐ์ ๊ตฌ์กฐ์ ์๋ฏธ๋ฅผ ์ค๋ช
ํ๋ Tag(MarkUp)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ๋ ์ธ์ด์ด๋ค.
Tag์ Tag ์ฌ์ด์ ๊ฐ์ด ํ์๋๊ณ , ๊ตฌ์กฐ์ ์ธ ์ ๋ณด๋ฅผ ํํํ ์ ์๋ค.
์คํค๋ง, DTD ๋ฑ์ ๋ฉํ์ ๋ณด๊ฐ ํํ๋๋ฉฐ, ์ฉ๋์ ๋ฐ๋ผ ๋ค์ํ ํํ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
ํนํ, XML์ ์ปดํจํฐ ๊ฐ(ex: PC - ์ค๋งํธํฐ) ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ๋งค์ฐ ์ ์ฉํ ์ ์ฅ๋ฐฉ์์ผ๋ก ์ฐ์ด๊ณ ์๋ค.
HTML๊ณผ ๋ฌธ๋ฒ ํํ๊ฐ ๋น์ทํ๊ธฐ ๋๋ฌธ์ ์ ๊ทํํ์์ผ๋ก parsing์ด ๊ฐ๋ฅํ๋, BeautifulSoup
์ ๊ฐ์ ์ข ๋ ์์ฌ์ด parser๋ค์ด ๋ง์ด ๊ฐ๋ฐ๋์ด์๋ค.
BeautifulSoup
HTML, XML ๋ฑ์ ๋งํฌ์ ์ธ์ด Scraping์ ์ํ ๋ํ์ ์ธ ๋๊ตฌ์ด๋ค.
lxml
,html5lib
์ ๊ฐ์ parser๋ฅผ ์ฌ์ฉํ๋ค.์๋๋ ์๋์ ์ผ๋ก ๋๋ฆฌ๋, ์ฌ์ฉ๋ฒ์ด ๊ฐํธํ๊ณ ๋ ํผ๋ฐ์ค๊ฐ ๋ง์ ์์ฃผ ์ฌ์ฉ๋๋ค.
PYTHON# ๋ฐ์ดํฐ ๋ค์ด๋ก๋ ๋ฐ๊ธฐ ์์ from bs4 import BeautifulSoupwith open('books.xml', 'r', encoding='utf8') as books_file:books_xml = books_file.read() # File์ String์ผ๋ก ์ฝ์ด์ค๊ธฐsoup = BeautifulSoup(books_xml, 'lxml') # lxml Parser๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ ๋ถ์# author๊ฐ ๋ค์ด๊ฐ ๋ชจ๋ element ์ถ์ถfor book_info in soup.find_all('author'):print(book_info)print(book_info.get_text())
JSON
JavaScript Object Notation
์ ์ค๋ง๋ก, ์๋๋ ์น ์ธ์ด์ธ JavaScript
์ ๋ฐ์ดํฐ ๊ฐ์ฒด ํํ ๋ฐฉ์์ด์๋ค.
XML์ ๋นํด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ด ํ์ฌ๋ XML์ ๋์ฒด์ ๋ก ๋ง์ด ํ์ฉ๋๊ณ ์๋ค.
- ๊ฐ๊ฒฐ์ฑ โ ๊ธฐ๊ณ์ ์ธ๊ฐ์ด ์ดํดํ๊ธฐ ํธํ๋ค
- ๋ฐ์ดํฐ ์ฉ๋์ด ์ ๋ค
- Code๋ก์ ์ ํ์ด ์ฝ๋ค
Python์์๋ Dict Type์ผ๋ก ์ ํํ ์ ์๋ ๋ฐ์ดํฐํ์์ด๋ฉฐ, JSON
๋ชจ๋์ ์ด์ฉํ์ฌ ํ์ฑ ๋ฐ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
ํ์ฌ ์น์์ ์ ๊ณตํ๋ API๋ ๋๋ถ๋ถ ์ ๋ณด ๊ตํ์ JSON์ ํ์ฉํ๊ณ ์๋ค.
// json_example.json{"employees": [ {"firstName":"John", "lastName":"Doe"}, {"firstName":"Anna", "lastName":"Smith"}, {"firstName":"Peter", "lastName":"Jones"},]}
import jsonwith open('json_example.json', 'r', encoding='utf8') as f: contents = f.read() json_data = json.loads(contents) print(json_data['employees'])# ๋ฐ๋๋ก, json.dumps๋ก ๋์
๋๋ฆฌ ํ์
์ json์ผ๋ก ๋ฐ๊พธ์ด ์ ์ฅํ ์๋ ์๋ค.with open('data.json', 'w') as f: json.dump(json_data, f)
์์์ ์๊ฐํ ์ฌ๋ฌ ๋ฐ์ดํฐ ํ์ ๋ค์ ํฌ๋กค๋ง ํ ๋ ๋ง๋งํ๋ค๋ฉด, ๋ค์์ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ๊ณ ํ์.