- 사용자 예외 클래스
예외 클래스를 직접 만들어보자!
Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다.
class NotUseZeroException(Exception): # Exception 클래스를 상속!
def __init__(self, n):
super().__init__(f'{n}은(는) 사용할 수 없습니다!!') # super로 Exception클래스로 넘김
def divCalculator(num1, num2):
if num2 == 0:
raise NotUseZeroException(num2)
else:
print(f'{num1} / {num2} = {num1 / num2}')
num1 = int(input('input number1 : '))
num2 = int(input('input number2 : '))
try:
divCalculator(num1, num2)
except NotUseZeroException as e:
print(e)
- 실습
관리자 암호를 입력하고 다음 상태에 따라 예외 처리하는 예외 클래스를 만들어보자.
ㆍ암호 길이가 5미만인 경우 : PasswordLengthShortException
ㆍ암호 길이가 10초과인 경우 : PasswordLengthLongException
ㆍ암호가 틀린 경우 : PasswordWrongException
class PasswordLengthShortException(Exception):
def __init__(self, str):
super().__init__(f'{str} : 길이 5미만!!')
class PasswordLengthLongException(Exception):
def __init__(self, str):
super().__init__(f'{str} : 길이 10초과!!')
class PasswordWrongException(Exception):
def __init__(self, str):
super().__init__(f'{str} : 잘못된 비밀번호!!')
adminPw = input('input admin password : ')
try:
if len(adminPw) < 5:
raise PasswordLengthShortException(adminPw) # 예외 발생
elif len(adminPw) > 10:
raise PasswordLengthLongException(adminPw)
elif adminPw != 'admin1234':
raise PasswordWrongException(adminPw)
elif adminPw == 'admin1234':
print('로그인 되었습니다.')
except PasswordLengthShortException as e1:
print(e1)
except PasswordLengthLongException as e2:
print(e2)
except PasswordWrongException as e3:
print(e3)
except 여러개 사용할 수 있다!
- 텍스트파일 쓰기
텍스트 파일을 파이썬으로 다뤄보자!
- 기본 함수
oper(), read(), write(), close()를 이용한 텍스트 파일 다루기
텍스트 파일 → oper() → read() or write() → close()
- 파일 쓰기
write() 함수를 이용한 파일에 문자열 쓰기
저장될 경로부터 정한다!
- open( 경로, w(쓰기), r(읽기) )
file = open('C:/pythonTxt/test.txt', 'w')
# 경로에 역슬래쉬를 꼭 슬래쉬로 바꿔줄 것 !
# write일때 경로에 파일이 없으면 생성된다 !
# 기존 글은 다 지워버리고 새롭게 덮는다 !
strCnt = file.write('Hello PYTHON!')
print(f'strCnt : {strCnt}')
file.close() # 파일 닫아주기 !
- 실습
다음과 같이 시스템 시간과 일정을 텍스트 파일에 작성해 보자.
import time
#
lt = time.localtime()
dateStr = '[' + str(lt.tm_year) + '년 ' + str(lt.tm_mon) + '월 ' + str(lt.tm_mday) + '일' ']'
# dateStr = str(lt.tm.mon)
todaySchedule = input('오늘 일정 : ')
file = open('C:/pythonTxt/test.txt', 'w')
file.write(dateStr + ' ' + todaySchedule)
file.close
dateStr 부분 계속 오류 확인 필요함 !
오류 해결 ^^
- 파일 읽기
read() 함수를 이용한 파일 문자열 읽기
file = open('C:/pythonTxt/test.txt', 'r')
str = file.read()
print(f'str : {str}')
print(f'len(str) : {len(str)}')
file.close()
import time
lt = time.localtime()
# dateStr = '[' + str(lt.tm_year) + '년 ' + str(lt.tm_mon) + '월 ' + str(lt.tm_mday) + '일' ']'
dateStr = '[' + time.strftime('%Y-%m-%d %I:%M:%S %p') + ']' # strftime을 사용한 시간 표현 %m과 %M 구분!
# %H는 13, 14, 15시
# %I는 1시, 2시, 3시
todaySchedule = input('오늘 일정 : ')
file = open('C:/pythonTxt/test.txt', 'w')
file.write(dateStr + ' ' + todaySchedule)
file.close
- 실습
다음 텍스트 파일에서 'Python'을 '파이썬'으로 변경해서 다시 저장해보자.
# about_python 파일
file = open('C:/pythonTxt/about_python.txt', 'r', encoding = 'UTF8') # UTF8로 encoding하여 오류를 없앤다.
str = file.read()
print(f'str : {str}') # UTF8 에러!
str = str.replace('Python', '파이썬', 2) # replace 활용! # 이렇게하면 모두 바뀐다 # 인수를 추가로 입력해주면 바꿀 개수를 정할 수 있다!
print(f'str : {str}')
file.close
# 다시 about_python.txt에 써주는 코드
file = open('C:/pythonTxt/about_python.txt', 'w')
file.write(str)
file.close()
- 텍스트파일 열기 모드
파일 모드는 파일을 어떤 목적으로 open 할지 정한다.
ㆍ 'w' : 쓰기 전용 (파일이 있으면 덮어씌움)
ㆍ 'a' : 쓰기 전용 (파일이 있으면 덧붙임) # 로그를 남길 때
ㆍ 'x' : 쓰기 전용 (파일이 있으면 에러 발생)
ㆍ 'r' : 읽기 전용 (파일이 없으면 에러 발생)
- 경로를 자주 사용하므로 변수에 저장 후 사용
uri = 'C:/pythonTxt/'
'w' 파일 모드
file = open(uri + 'hello.txt', 'w')
file.write('Hello python!!')
file.close()
'a' 파일 모드
file = open(uri + 'hello.txt', 'a')
file.write('\nNice to meet you!!')
file.close()
'x' 파일 모드
file = open(uri + 'hello_01.txt', 'x')
file.write('Nice to meet you!!')
file.close()
'r' 파일 모드
file = open(uri + 'hello.txt', 'r')
str = file.read()
print(f'str : {str}')
file.close()
- 실습
사용자가 입력한 숫자에 대한 소수를 구하고 이를 파일에 작성해보자.
def writePrimeNumber(n):
file = open(uri + 'print_numbers.txt', 'a') # 사용자가 입력한 숫자가 누적으로 쌓여야 함으로!
file.write(str(n)) # str로 캐스팅 하지 않고 숫자를 바로 읽으면 오류가 난다!
file.write('\n')
file.close()
inputNumber = int(input('0보다 큰 정수 입력 : '))
for number in range(2, (inputNumber + 1)):
flag = True
for n in range(2, number):
if number % n == 0:
flag = False
break
if flag: # 소수이면
writePrimeNumber(number)
- with ~ as문
with ~ as문을 이용하면 파일 닫기(close)를 생략할 수 있다.
file.close()는 누가 하더라도 뻔한 작업이므로 !
주로 with ~ as를 사용하는 것을 권장!
uri = 'C:/pythonTxt/'
file = open(uri + '5_037.txt', 'a')
file.write('python study!!')
file.close()
file = open(uri + '5_037.txt', 'r')
print(file.read())
file.close()
위 코드를 with ~ as문으로!
with open(uri + '5_037.txt', 'a') as f:
f.write('python study!!') # file.close()를 안해도 된다!
with open(uri + '5_037.txt', 'r') as f:
print(f.read()) # file.close()를 안해도 된다!
- 실습
로또 번호 생성기 프로그램을 만들고 파일에 번호를 출력해 보자.
import random
def writeNumbers(nums):
for idx, num in enumerate(nums):
with open(uri + 'lotto.txt', 'a') as f:
if idx < (len(nums) - 2):
f.write(str(num) + ', ') # 숫자 사이에 , 찍어줌
elif idx == (len(nums) - 2):
f.write(str(num))
elif idx == (len(nums) - 1):
f.write('\n')
f.write('bonus : ' + str(num))
f.write('\n')
rNums = random.sample(range(1, 46), 7) # 1~45까지 7개 뽑음
print(f'rNums : {rNums}')
writeNumbers(rNums)
이해 될 때까지 복습하기 !
- writelines()
writelines()는 리스트(List) 또는 튜플 데이터를 파일에 쓰기 위한 함수이다.
languages = ['c/c++', 'java', 'c#', 'python', 'javascript']
uri = 'C:/pythonTxt/'
for item in languages:
with open(uri + 'languages.txt', 'a') as f:
f.write(item)
f.write('\n')
위의 코드를 writelines()를 사용해서 작성
languages = ['c/c++', 'java', 'c#', 'python', 'javascript']
uri = 'C:/pythonTxt/'
with open(uri + 'languages.txt', 'a') as f:
# f.writelines(languages) # 개행 없이 바로 들어감
f.writelines(item + '\n' for item in languages) # 개행 추가
with open(uri + 'languages.txt', 'r') as f:
str = f.read()
print(str)
- 실습
딕셔너리에 저장된 과목별 점수를 파일에 저장하는 코드를 작성하자.
uri = 'C:/pythonTxt/'
scoreDic = {'kor' : 85, 'eng' : 90, 'mat' : 92, 'sci' : 79, 'his' : 82}
for key in scoreDic.keys():
with open(uri + 'scoreDic.txt', 'a') as f:
f.write(key + '\t:' + str(scoreDic[key]) + '\n')
scoreDic = {'kor' : 85, 'eng' : 90, 'mat' : 92, 'sci' : 79, 'his' : 82}
scoreList = [85, 90, 92, 79, 82]
with open(uri + 'scores.txt', 'a') as f:
print(scoreDic, file = f) # 이렇게 해도 text파일에 그대로 들어감
with open(uri + 'scores.txt', 'a') as f:
print(scoreList, file = f) # List도 가능함 !
- readlines()
파일의 모든 데이터를 읽어서 리스트 형태로 반환한다.
- readline()
한 행을 읽어서 문자열로 반환 한다.
모든 데이터 읽기!
uri = 'C:/pythonTxt/'
with open(uri + 'lens.txt', 'r') as f:
lanList = f.readlines()
print(f'lanList : {lanList}') # 개행까지 다 출력된다!
print(f'lanList type : {type(lanList)}')
한 행씩 읽기!
uri = 'C:/pythonTxt/'
with open(uri + 'lens.txt', 'r') as f:
line = f.readline()
while line != '':
print(f'line : {line}', end = '') # print내부 개행과 line의 개행이 합쳐져서 2개의 개행이 된다 end=''해주면 한번만 됨!
line = f.readline()
- 실습
파일에 저장된 과목별 점수를 파이썬에서 읽어, 딕셔너리에 저장하는 코드를 만들어보자.
scoreDic = {}
with open(uri + 'scores.txt', 'r') as f:
line = f.readline() # 한 줄씩 읽기
while line != '':
temp = line.split(':') # split으로 구분자를 설정하여, \n을 지워줘야함!
scoreDic[temp[0]] = int(temp[1].strip('\n')) # temp[0]이 키값! [1]이 밸류값 # strip()함수로 \n을 지워줌
line = f.readline()
이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.