(Python 5-1๊ฐ) File / Exception / Log Handling
210804
Exception
์์ธ์๋ ์์์ด ๊ฐ๋ฅํ๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
์์ ๊ฐ๋ฅํ ์์ธ
๋ฐ์ ์ฌ๋ถ๋ฅผ ์ฌ์ ์ ์ธ์งํ ์ ์๋ ์์ธ
์ฌ์ฉ์์ ์๋ชป๋ ์ ๋ ฅ, ํ์ผ ํธ์ถ ์ ํ์ผ ์์
๊ฐ๋ฐ์๊ฐ ๋ฐ๋์ ๋ช ์์ ์ผ๋ก ์ ์ ํด์ผํจ
์์ ๋ถ๊ฐ๋ฅํ ์์ธ
์ธํฐํ๋ฆฌํฐ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์์ธ, ๊ฐ๋ฐ์ ์ค์
๋ฆฌ์คํธ์ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ ๊ฐ ํธ์ถ, ์ ์ 0์ผ๋ก ๋๋
์ํ ๋ถ๊ฐ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ์๋ ํธ์ถใ
์์์ด ๊ฐ๋ฅํ๋ฉด if๋ฌธ์ผ๋ก ์กฐ๊ฑด์ ๋ฌ์์ฃผ๋ฉด ๋๋ค. ์์์ด ๋ถ๊ฐ๋ฅ ํ๋ค๋ฉด? => Exception Handling
Exception Handling
try - except ๋ฌธ๋ฒ
try:
์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋
except <Exception Type>:
์์ธ ๋ฐ์์ ๋์ํ๋ ์ฝ๋
try-except-finally ๋ฌธ๋ฒ
try:
์์ธ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋
except <Exception Type>:
์์ธ ๋ฐ์์ ๋์ํ๋ ์ฝ๋
finally:
์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ์คํ๋จ
Exception์ ์ข ๋ฅ
Built-in Exception: ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์์ธ
IndexError : List์ Index ๋ฒ์ ์ด๊ณผ
NameError : ์กด์ฌํ์ง ์๋ ๋ณ์ ํธ์ถ
ZeroDivisionError : 0์ผ๋ก ์ซ์๋ฅผ ๋๋ ๋
Value Error : ๋ณํํ ์ ์๋ ๋ฌธ์/์ซ์ ๋ณํํ ๋
FileNotFoundError : ์กด์ฌํ์ง ์๋ ํ์ผ์ ํธ์ถํ ๋
๊ทธ ์ธ์๋ ์ ๊ณต๋๋ ์์ธ๊ฐ ๊ต์ฅํ ๋ง๋ค
์์ธ ์ ๋ณด ํ์ํ๊ธฐ
for i in range(10):
try:
print(10 / i)
except ZeroDivisionError as e:
print(e)
print("Not divided by 0")
raise ๊ตฌ๋ฌธ
ํ์์ ๋ฐ๋ผ ๊ฐ์ ๋ก Exception์ ๋ฐ์์ํจ๋ค.
raise <Exception Type>(์์ธ์ ๋ณด)
while True:
value = input("๋ณํํ ์ ์ ๊ฐ์ ์
๋ ฅํด์ฃผ์ธ์")
for digit in value:
if digit not in "0123456789":
raise ValueError("์ซ์๊ฐ์ ์
๋ ฅํ์ง\
์์ผ์
จ์ต๋๋ค")
print("์ ์๊ฐ์ผ๋ก ๋ณํ๋ ์ซ์ -", int(value))
assert ๊ตฌ๋ฌธ
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ ์์ธ ๋ฐ์
assert ์์ธ์กฐ๊ฑด
def get_binary_nmubmer(decimal_number):
assert isinstance(decimal_number, int)
return bin(decimal_number)
print(get_binary_nmubmer(10))
File Handling
ํ์ผ์ ์ข ๋ฅ
๊ธฐ๋ณธ์ ์ธ ํ์ผ ์ข ๋ฅ๋ก๋ text ํ์ผ๊ณผ binary ํ์ผ๋ก ๋๋๋ค.
๋ชจ๋ ํ ์คํธ ํ์ผ๋ ์ค์ ๋ก๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด๋ค.
์ปดํจํฐ๋ ํ ์คํธ ํ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ๋ณํ์ํจ๋ค.
text ํ์ผ
์ธ๊ฐ๋ ์ดํดํ ์ ์๋ ํํ์ธ ๋ฌธ์์ด ํ์์ผ๋ก ์ ์ฅ๋ ํ์ผ
๋ฉ๋ชจ์ฅ์ผ๋ก ์ด๋ฉด ๋ด์ฉ ํ์ธ ๊ฐ๋ฅ
๋ฉ๋ชจ์ฅ์ ์ ์ฅ๋ ํ์ผ, HTML ํ์ผ, ํ์ด์ฌ ์ฝ๋ ํ์ผ ๋ฑ
binary ํ์ผ
์ปดํจํฐ๋ง ์ดํดํ ์ ์๋ ํํ์ธ
์ด์ง(๋ฒ)ํ์์ผ๋ก ์ ์ฅ๋ ํ์ผ
์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ์ฅ์ผ๋ก ์ด๋ฉด
๋ด์ฉ์ด ๊นจ์ ธ ๋ณด์ (๋ฉ๋ชจ์ฅ ํด์ค ๋ถ๊ฐ)
์์ ํ์ผ, ์๋ ํ์ผ ๋ฑ๋ฑ
Python File I/O
f = open("<ํ์ผ์ด๋ฆ>", "์ ๊ทผ ๋ชจ๋")
f.close()
# ์ ๊ทผ ๋ชจ๋
r : ์ฝ๊ธฐ๋ชจ๋
w : ์ฐ๊ธฐ๋ชจ๋
a : ์ถ๊ฐ๋ชจ๋
w, ์ฐ๊ธฐ๋ชจ๋์ ๊ฒฝ์ฐ encoding ๋ฐฉ์์ utf8๊ณผ cp949 ๋ฑ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ ์ ์๋ค. ํ์ ํ ๋๋ ์ด๋ฅผ ํต์ผํ๋๊ฒ ์ข๋ค.
๋, w๋ ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
a, ์ถ๊ฐ๋ชจ๋๋ ๊ธฐ์กด ํ์ผ์ ๋ง์ง๋ง๋ถํฐ ์ด์ด์ ๋ถ์ด๊ฒ ๋๋ค.
Directory ๋ค๋ฃจ๊ธฐ
๋๋ ํ ๋ฆฌ ์์ฑ
import os
os.mkdir("log")
๋๋ ํ ๋ฆฌ ์กด์ฌ ์ฌ๋ถ ํ์ธ
if not os.path.isdir("log"):
os.mkdir("log")
๊ฒฝ๋ก ์ฐ๊ฒฐํ๊ธฐ
folder = os.getcwd()
file = 'abc.txt'
os.path.join(folder, file)
์ด ๋ ๋ฌธ์์ด๋ก ์ฐ๊ฒฐํ ์๋ ์๋๋ฐ, ๋งฅ๊ณผ ์๋์ฐ๊ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ตฌ๋ถํ๋ ๊ธฐํธ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
join
์ ๊ถ์ฅํ๋ค.
pathlib ๋ชจ๋์ ์ฌ์ฉํด์ path๋ฅผ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๊ธฐ
>>> import pathlib
>>>
>>> cwd = pathlib.Path.cwd()
>>> cwd
WindowsPath('D:/workspace')
>>> cwd.parent
WindowsPath('D:/')
>>> list(cwd.parents)
[WindowsPath('D:/')]
>>> list(cwd.glob("*"))
[WindowsPath('D:/workspace/ai-pnpp'),
WindowsPath('D:/workspace/cs50_auto_grader'),
WindowsPath('D:/workspace/data-academy'),
WindowsPath('D:/workspace/DSME-AI-SmartYard'),
WindowsPath('D:/workspace/introduction_to_python_TEAMLAB_MOOC'),
ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธ
if not os.path.exists("log/count_log.txt"):
f = open("log/count_log.txt", 'w', encoding="utf8")
Pickle
ํ์ด์ฌ์ ๊ฐ์ฒด๋ฅผ ์์ํ ํ๋ built-in ๊ฐ์ฒด. ๋ฐ์ดํฐ๋ object๋ฑ ์คํ์ค ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค. python ์ ์ฉ binary ํ์ผ์ด๋ผ๊ณ ์ดํดํ ์ ์๋ค.
์์ํ๋ ํ์ด์ฌ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ํ์ผ๋ก ์ ์ฅํด์ ์ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํผํด ํ์ผ ์์ฑํ๊ธฐ
import pickle
f = open("list.pickle", "wb")
test = [1, 2, 3, 4, 5]
pickle.dump(test, f)
f.close()
binary ํ์ผ์ด๋ฏ๋ก 'w' ๋์ 'wb'๋ฅผ ๋ถ์ฌ์คฌ๋ค.
ํผํด ๋ถ๋ฌ์ค๊ธฐ
f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
print(test_pickle)
f.close()
Loggin Handling
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ผ์ด๋๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ก์ ๋จ๊ธฐ๊ธฐ
์ ์ ์ ์ ๊ทผ, ํ๋ก๊ทธ๋จ์ Exception, ํน์ ํจ์์ ์ฌ์ฉ
Console ํ๋ฉด์ ์ถ๋ ฅ, ํ์ผ์ ๋จ๊ธฐ๊ธฐ, DB์ ๋จ๊ธฐ๊ธฐ ๋ฑ๋ฑ
๊ธฐ๋ก๋ ๋ก๊ทธ๋ฅผ ๋ถ์ํ์ฌ ์๋ฏธ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ ํ ์ ์์
์คํ์์ ์์ ๋จ๊ฒจ์ผ ํ๋ ๊ธฐ๋ก, ๊ฐ๋ฐ์์ ์์ ๋จ๊ฒจ์ผํ๋ ๊ธฐ๋ก
logging ๋ชจ๋
import logging
logging.debug("ํ๋ ธ์์!")
logging.info("ํ์ธํด")
logging.warning("์กฐ์ฌํด!")
logging.error("์๋ฌ๋ฌ์ด!!!")
logging.critical ("๋งํ๋ค...")
logging level
debug : ๊ฐ๋ฐ์ ์ฒ๋ฆฌ ๊ธฐ๋ก์ ๋จ๊ฒจ์ผํ๋ ๋ก๊ทธ ์ ๋ณด๋ฅผ ๋จ๊น
info : ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ ๋์์ ์ ๋ณด๋ฅผ ์๋ฆผ
warning : ์ฌ์ฉ์๊ฐ ์๋ชป ์ ๋ ฅํ ์ ๋ณด๋ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ ์๋ ๊ฐ๋ฐ์ ์๋์น ์๋ ์ ๋ณด๊ฐ ๋ค์ด์์ ๋ ์๋ฆผ
error : ์๋ชป๋ ์ฒ๋ฆฌ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฌ์ผ๋, ํ๋ก๊ทธ๋จ์ ๋์ํ ์ ์์์ ์๋ฆผ.
critical : ์๋ชป๋ ์ฒ๋ฆฌ๋ก ๋ฐ์ดํฐ ์์ค์ด๋ ๋ ์ด์ ํ๋ก๊ทธ๋จ์ด ๋์ํ ์ ์์์ ์๋ฆผ
import logging
# Logger ์ ์ธ
logger = logging.getLogger("main")
# Logger์ output ๋ฐฉ๋ฒ ์ ์ธ
stream_hander = logging.StreamHandler()
# Logger์ output ๋ฑ๋ก
logger.addHandler(stream_hander)
logger.setLevel(logging.DEBUG)
logger.debug("ํ๋ ธ์์!")
logger.info("ํ์ธํด")
logger.warning("์กฐ์ฌํด!")
logger.error("์๋ฌ๋ฌ์ด!!!")
logger.critical("๋งํ๋ค...")
logger.setLevel(logging.CRITICAL)
logger.debug("ํ๋ ธ์์!")
logger.info("ํ์ธํด")
logger.warning("์กฐ์ฌํด!")
logger.error("์๋ฌ๋ฌ์ด!!!")
logger.critical("๋งํ๋ค...")
Logging formmater
Log์ ๊ฒฐ๊ณผ๊ฐ์ ํฌ๋งท์ ์ง์ ํด ์ค ์ ์์
formatter = logging.Formatter('%(asctime)s %(levelname)s %(process)d %(message)s')
2018-01-18 22:47:04,385 ERROR 4410 ERROR occurred
2018-01-18 22:47:22,458 ERROR 4439 ERROR occurred
2018-01-18 22:47:22,458 INFO 4439 HERE WE ARE
2018-01-18 22:47:24,680 ERROR 4443 ERROR occurred
2018-01-18 22:47:24,681 INFO 4443 HERE WE ARE
2018-01-18 22:47:24,970 ERROR 4445 ERROR occurred
2018-01-18 22:47:24,970 INFO 4445 HERE WE ARE
ํ๋ก๊ทธ๋จ ์ค์
๋ฌด์์?
๋ฐ์ดํฐ ํ์ผ ์์น, ํ์ผ ์ ์ฅ ์ฅ์, Operation Type ๋ฑ
์ด๋ป๊ฒ?
configparser : ํ์ผ์
argparser : ์คํ ์์ ์
configparser
ํ๋ก๊ทธ๋จ์ ์คํ ์ค์ ์ file์ ์ ์ฅํจ
Section, Key, Value ๊ฐ์ ํํ๋ก ์ค์ ๋ ์ค์ ํ์ผ์ ์ฌ์ฉ
์ค์ ํ์ผ์ Dict Type์ผ๋ก ํธ์ถํ ์ฌ์ฉ
import configparser
config = configparser.ConfigParser()
config.sections()
config.read('example.cfg')
config.sections()
for key in config['SectionOne']:
print(key)
argparser
Console ์ฐฝ์์ ํ๋ก๊ทธ๋จ ์คํ์ Setting ์ ๋ณด๋ฅผ ์ ์ฅํจ
๊ฑฐ์ ๋ชจ๋ Console ๊ธฐ๋ฐ Python ํ๋ก๊ทธ๋จ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต
ํน์ ๋ชจ๋๋ ๋ง์ด ์กด์ฌํ์ง๋ง(TF), ์ผ๋ฐ์ ์ผ๋ก argparse๋ฅผ ์ฌ์ฉ
Command-Line Option ์ด๋ผ๊ณ ๋ถ๋ฆ
import argparse
parser = argparse.ArgumentParser(description='Sum two integers.')
# ์งง์ ์ด๋ฆ, ๊ธด ์ด๋ฆ, ํ์๋ช
, Help ์ค๋ช
, Argument Type
parser.add_argument('-a', "--a_value", dest=โA_value", help="A integers", type=int)
parser.add_argument('-b', "--b_value", dest=โB_value", help="B integers", type=int)
args = parser.parse_args()
print(args)
print(args.a)
print(args.b)
print(args.a + args.b)
>>> python arg_sum.py -a 10 -b 10
Namespace(a=10, b=10)
10
10
20
Last updated
Was this helpful?