์ธ๊ณต์ง€๋Šฅ์„ ์œ„ํ•œ ํŒŒ์ด์ฌ - ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

BoostCamp AI Tech

Python

log

regex

XML

csv

JSON

01/22/2021


๋ณธ ์ •๋ฆฌ ๋‚ด์šฉ์€ Naver BoostCamp AI Tech์˜ edwith์—์„œ ์ˆ˜๊ฐ•ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‚ฌ์‹ค๊ณผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜, ์ˆ˜์ •์ด ํ•„์š”ํ•œ ์‚ฌํ•ญ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.


Python์œผ๋กœ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ

Exception Handling

Exception์ด๋ž€?

  1. ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ
    • ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ์‚ฌ์ „์— ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์ด๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ์ž…๋ ฅ์„ ํ•˜๊ฑฐ๋‚˜, ํŒŒ์ผ์„ ํ˜ธ์ถœํ•˜์˜€๋Š”๋ฐ ํŒŒ์ผ์ด ์—†์„ ๊ฒฝ์šฐ
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ if ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ
  2. ์˜ˆ์ƒ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ
    1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋กœ, ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    2. ๋ฆฌ์ŠคํŠธ์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’์„ ํ˜ธ์ถœ(out of range), ์ •์ˆ˜ 0์œผ๋กœ ๋‚˜๋ˆ”(division by zero)
    3. ์ˆ˜ํ–‰ ๋ถˆ๊ฐ€์‹œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ž๋™ ํ˜ธ์ถœํ•œ๋‹ค.

๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์˜ˆ์™ธ์— ๊ด€ํ•˜์—ฌ Exception Handling์„ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

Python์˜ Built-in Exception

<์ž์ฃผ ๋‚˜์˜ค๋Š” Exception>

Exception ์ด๋ฆ„๋‚ด์šฉ
IndexErrorList์˜ Index ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐˆ ๋•Œ
NameError์กด์žฌํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ
ZeroDivisionError0์œผ๋กœ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆŒ ๋•Œ
ValueError๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž/์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•  ๋•Œ
FileNotFoundError์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ํ˜ธ์ถœํ•  ๋•Œ

Python์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

  • try ~ except ๋ฌธ๋ฒ•

  • if๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, try ~ except ๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค.

    Python์—์„œ๋Š” if ๋Š” ๋กœ์ง์˜ ํ˜•ํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, try ~ except ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์˜ˆ์™ธ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

    PYTHON
    try:
    ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์ฝ”๋“œ
    except <Exception Type>:
    ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ

  • try ~ except ~ else

  • ์žก์€ ์˜ˆ์™ธ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ else๋ฌธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    PYTHON
    try:
    ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์ฝ”๋“œ
    except <Exception Type>:
    ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ
    else:
    ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋•Œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ

  • try ~ except ~ finally

  • ์˜ˆ์™ธ๋ฅผ ์žก์•˜๋Š”์ง€์™€ ๊ด€๊ณ„ ์—†์ด finally ๊ตฌ๋ฌธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    PYTHON
    try:
    ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ ์ฝ”๋“œ
    except <Exception Type>:
    ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ
    finally:
    ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์‹คํ–‰๋จ

  • raise => raise <Exception Type>(์˜ˆ์™ธ์ •๋ณด)

  • ํŠน์ • ์˜ˆ์™ธ๋ฅผ ๊ณ ์˜์ ์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    PYTHON
    while True:
    value = input("๋ณ€ํ™˜ํ•  ์ •์ˆ˜ ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
    for digit in value:
    if digit not in "0123456789":
    raise ValueError("์ˆซ์ž๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ์…จ์Šต๋‹ˆ๋‹ค")
    print("์ •์ˆ˜๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋œ ์ˆซ์ž -", int(value))

  • assert ์˜ˆ์™ธ์กฐ๊ฑด

  • ํŠน์ • ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  • ์ตœ๊ทผ์—๋Š” type hinting ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ์กฐ๊ธˆ ์ค„์–ด๋“ค์—ˆ๋‹ค.

    PYTHON
    def 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)
PYTHON
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๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

PYTHON
import os
os.mkdir("log") #ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— "log" ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
# Exception Handling๊ณผ๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
try:
os.mkdir("abc")
except FileExistsError as e:
print("Already created")
os.path.exists("abc") # abc๋ผ๋Š” ํด๋”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  Boolean๊ฐ’ ๋ฐ˜ํ™˜
# ํŒŒ์ผ์„ ์˜ฎ๊ธธ๋•Œ
import shutil
source = "I_have_a_dream.txt"
dest = os.path.join("abc", "log.txt") # ๋””๋ ‰ํ† ๋ฆฌ์™€ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ํ•ฉ์ณ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ
shutil.copy(source, dest) # abc/log.txt
# ์ตœ๊ทผ์—๋Š” path๋ฅผ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃจ๋Š” pathlib ๋ชจ๋“ˆ์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŽธ.
import pathlib
cwd = pathlib.Path.cwd() # current working directory, ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ
list(cwd.parent) # ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ถ€๋ชจ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์šฉ๋ฌผ ๋ฆฌ์ŠคํŠธํ™”

Pickle

Python์˜ ๊ฐ์ฒด๋Š” ์ƒ์„ฑ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ”๋‹ค๊ฐ€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‚ด๋ ค์˜ค๊ฒŒ(์‚ฌ๋ผ์ง€๊ฒŒ)๋œ๋‹ค.

Pickle์€ ์ด์ฒ˜๋Ÿผ ์ผ์‹œ์ ์ธ Python์˜ ๊ฐ์ฒด๋ฅผ ์˜์†ํ™”(persistence)ํ•˜๋Š” built-in ๊ฐ์ฒด๋กœ, Python์— ํŠนํ™”๋œ binary ํŒŒ์ผ์ด๋‹ค.

๋ฐ์ดํ„ฐ, object ๋“ฑ ์‹คํ–‰ ์ค‘ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ €์žฅํ•ด์•ผํ•˜๋Š” ์ •๋ณด, ๊ณ„์‚ฐ ๊ฒฐ๊ณผ(๋ชจ๋ธ) ๋“ฑ ํ™œ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•˜๋‹ค.

PYTHON
import pickle
f = 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 ์ˆ˜์ค€์œผ๋กœ ๋กœ๊ทธ ๋ ˆ๋ฒจ์ด ๋‹ฌ๋ผ์ง„๋‹ค.

PYTHON
import logging
logging.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 ์„ค์ •๋ฒ•

  1. configparser : ํŒŒ์ผ์— ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹

    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์„ค์ •์„ file์— ์ €์žฅํ•œ๋‹ค.
    • Section, Key, Value ๊ฐ’์˜ ํ˜•ํƒœ๋กœ ์„ค์ •๋œ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์„ค์ •ํŒŒ์ผ์„ Dict Type์œผ๋กœ ํ˜ธ์ถœ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    PYTHON
    # config file(.cfg)
    [SectionOne] # section์€ ๋Œ€๊ด„ํ˜ธ
    Name : Alphaca # ์†์„ฑ์€ Key, Value
    Age : 25
    Address : Seoul
    [SectionTwo]
    FavoriteSinger = Beenzino
    [SectionThree]
    FavoriteSong = AlwaysAwake
    PYTHON
    # configparser file
    import configparser
    config = configparser.ConfigParser()
    config.sections()
    config.read('example.cfg')
    config.sections() # ['SectionOne', 'SectionTwo', 'SectionThree']
    for key in config['SectionTwo']:
    print(key) # FavoriteSinger
    config['SectionOne']['Age']
  2. argparser : Console์ฐฝ์—์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ Setting ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹

    • ๊ฑฐ์˜ ๋ชจ๋“  Console ๊ธฐ๋ฐ˜ Python ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ ์žˆ๋‹ค.
    • ํŠน์ˆ˜ ๋ชจ๋“ˆ๋„ ๋งŽ์ด ์กด์žฌํ•˜์ง€๋งŒ(TF), ์ผ๋ฐ˜์ ์œผ๋กœ argparser๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
    • Command-Line Option์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค
      • ํ„ฐ๋ฏธ๋„์—์„œ ๋ถ™์ด๋Š” -h , --help ๊ฐ™์€ ์˜ต์…˜๋“ค๋„ argparser์˜ ์˜ˆ์‹œ
    PYTHON
    import argparse
    parser = 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 ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•œ๋‹ค.

PYTHON
import csv
reader = csv.reader(f, delimeter=',', quotechar='"', quoting=csv.QUOTE_ALL)
AttributeDefaultMeaning
delimiter,๊ธ€์ž๋ฅผ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€
lineterminator\r\n์ค„๋ฐ”๊ฟˆ ๊ธฐ์ค€
quotechar"๋ฌธ์ž์—ด์„ ๋‘˜๋Ÿฌ์‹ธ๋Š” ์‹ ํ˜ธ๋ฌธ์ž
quotingQUOTE_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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

PYTHON
# ํŠน์ • URL์—์„œ ์›ํ•˜๋Š” ๋ฌธ์ž์—ด ํŒŒ์‹ฑํ•ด์˜ค๊ธฐ
import re
import urllib.request
url = "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 BeautifulSoup
      with 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
// json_example.json
{"employees": [
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"},
]}
PYTHON
import json
with 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)

์œ„์—์„œ ์†Œ๊ฐœํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์„ ํฌ๋กค๋ง ํ•  ๋•Œ ๋ง‰๋ง‰ํ•˜๋‹ค๋ฉด, ๋‹ค์Œ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

ํŒŒ์ด์ฌ ์›นํฌ๋กค๋ง๊ณผ ์ž๋™ํ™”์— ๋Œ€ํ•œ A to Z


WRITTEN BY

์•ŒํŒŒ์นด์˜ Always Awake Devlog

Seoul