[제로베이스_데이터 취업 스쿨 16기] 7일차(6/12)

jumee·2023년 6월 12일
0
post-thumbnail

사용자 예외 클래스

Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다.
사용자 예외 클래스는 반드시 Exception 클래스를 상속받아야 한다.

예제

  1. 관리자 번호를 입력하고 다음 상태에 따라 예외 처리하는 예외 클래스를 만들자.
# 1. 암호 길이가 5미만인 경우
class PasswordLengthShortException(Exception):

    def __init__(self,n):
        super().__init__(f'{n} : 길이 5미만!')

# 2. 암호 길이가 10을 초과하는 경우
class PasswordLengthLongException(Exception):

    def __init__(self,n):
        super().__init__(f'{n} : 길이 10초과!')


# 3. 암호가 잘못된 경우

class PasswordWrongException(Exception):

    def __init__(self,n):
        super().__init__(f'{n}  잘못된 비밀번호!')


password = input('input admin password: ')


try:
    if len(password) < 5:
        raise PasswordLengthShortException(password)
    elif len(password) > 10:
        raise PasswordLengthLongException(password)
    elif password != 'admin1234':
        raise PasswordWrongException(password)
    elif password == 'admin1234':
        print('빙고!')

except PasswordLengthShortException as e1:
    print(e1)

except PasswordLengthLongException as e2:
    print(e2)

except PasswordWrongException as e3:
    print(e3)

텍스트 파일 다루기

open(), read(), write(), close() 를 이용해서 텍스트 파일을 다룰 수 있다.

  1. 파일을 쓰거나, 읽고 싶을 때 : open()
  • open('파일 디렉토리명', 'w') : 파일을 연 뒤, 새로운 내용을 쓴다.
    ❗️ 기존에 내용이 있는 경우, 기존의 내용은 완전히 사라진다.
    file = open('디렉토리명', 'w')
    strCnt = file.write('블라블라') # 반환값은 쓴 문자의 개수다
    print(f'strCnt : {strCnt}')
    file.close() # 반드시 닫아줘야 됨. 
    예제 코드
# 시스템 시간과 일정을 텍스트 파일에 작성해보자.

import time

lt = time.localtime()

dateStr = '[' + str(lt.tm_year) + '년 ' +\
    str(lt.tm_mon) + '월 ' +\
    str(lt.tm_mday) + '일]'

toDo = input('오늘 일정: ')

file = open("디렉토리", 'w')
file.write(dateStr + toDo)
file.close()
  • open('파일 디렉토리명', 'r') : 파일을 연 뒤, 파일 내용을 읽는다.
    ❗️read의 경우에는 파일이 존재하지 않으면 오류가 발생
    read는 어떤 형태로 쓰여져있건, 문자로 읽어온다.

💎 잠깐 알고가기 💎

  • str.strftime() : date나 datetime 포맷의 시간값을 원하는 문자열 포맷으로 변경할 때 쓴다.
dateStr = '[' + time.strftime('%Y-%M-%d %H:%M:%S %p') + ']' # %p는 AM/PM 을 나타낸다.
  • %H, %I
    • %H : 24시간 표시로, 오후 1시의 경우 13시로 표시한다.
    • %I : 12시간 표시로, 오후 1시의 경우 1시로 표시한다.

예제 코드

  1. 파일에 있는 특정 문자를 다른 문자로 변경해보자.
new = open('디렉토리명', 'w')
new.write('~~')

new.close()

# 기존 파일을 일단 읽어온다음에
new = open('디렉토리명', 'r')
forChange = new.read()
forChange = forChange.replace('Python','파이썬') # 모든 'Python'을 '파이썬'으로 변경해준다.

new.close()

❗️만약 전체를 바꾸는 것이 아니라 특정 개수만 바꿔주고 싶다면 다음과 같이 replace()를 사용한다.

str.replace('바꾸기 전 문자','바꿀 문자',개수)

파일 열기 모드

w, a, x, r 정도가 있다.

  • 'w' : 쓰기 전용(파일이 있다면 덮어씌운다)
    기존에 있는 내용은 모두 지운다.
  • 'a' : 쓰기 전용(파일이 있다면 덧붙여준다)
    기존에 있는 내용에 덧붙여준다.
  • 'x' : 쓰기 전용(파일이 있다면 error 발생)
  • 'r' : 읽기 전용(파일이 없다면 error 발생)

예제 코드

  1. 사용자가 입력한 숫자까지의 값중에서 소수만 파일에 작성하는 코드
url = '저장할 디렉토리'

def writePrimeNumber(n):
    file = open(url + 'prime_numbers.txt', 'a')
    file.write(str(n))
    file.write('\n')

    file.close()


inputNumber = int(input('0보다 큰 정수 입력: '))
for num in range(2, (inputNumber + 1)): # 2부터 입력한 정수까지의 숫자까지 돌면서
    flag = True
    for i in range(2,num): # 2 ~ (자기자신 - 1)의 값 중 하나라도 나누어떨어지는 숫자가 있다면
        if num % i == 0:
            flag = False
            break
    if flag == True: # 2 ~ (자기자신 - 1)의 값 중 나누어떨어지는 숫자가 하나도 없다면
        writePrimeNumber(num)

with ~ as

with ~ as 문을 사용하면 파일 닫기(close)를 생략할 수 있다.

🔻 아래와 같이 쓰인다.

uri = '디렉토리'

with open(uri + '파일이름.txt', 'a') as f:
	f.write('python study!!')

with open(uri + '파일이름.txt', 'r') as f:
	print(f.read())

예제 코드

  1. 로또 번호 생성기 프로그램을 만들고 파일에 번호를 출력
import random

rNums = random.sample(range(1,46), 7) # 1 ~ 46까지의 번호중에 7개를 랜덤하게 추출 -> 리스트에
print(f'rNums : {rNums}')


def writeNumbers(nums):
	for idx, num in enumerate(nums):
		with open(uri + '파일이름', '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')


writeNumbers(rNums)

writelines() / readlines() / readline()

  • writelines()

    리스트 또는 튜플 데이터를 파일에 쓰기 위한 함수다

❗️하지만 그냥 writelines() 만 해주면 개행이 되지 않는 상태로 써진다. 개행을 하고 싶다면 아래와 같이 해준다.

with open(uri + '파일이름.txt', 'a') as f:
	f.writelines(item + '\n' for item in laguages)

➡️ 즉, writelines() 안에 for문을 넣어줘서 각 원소마다 개행문자를 붙여주면 된다.

예제 코드

  1. 딕셔너리에 저장된 과목별 점수를 파일에 저장하는 코드를 작성
scoreDic = {'kor':85, 'eng':90, 'mat':92, 'sci':79, 'his':82}

uri = '파일 디렉토리'

for key in scoreDic.keys(): # key 값들만 포함된 리스트
	with open(uri + '파일이름.txt', 'a') as f:
		f.writelines(key + '\t: ' + str(scoreDic[key]) + '\n')

❗️ 딕셔너리나 리스트 모양 그대로 출력하고 싶다면 아래와 같이 해준다.

  • print(써주고 싶은 리스트 또는 딕셔너리, file=파일이름)
scoreDic = {'kor':85, 'eng':90, 'mat':92, 'sci':79, 'his':82}
with open(uri + '파일이름2.txt', 'a') as f:
	print(scoreDic, file=f)
  • readlines() / readline()
    • readlines() : 파일의 모든 데이터를 읽어서 리스트 형태로 반환
    • readline() : 한 행만 읽어서 문자열 형태로 반환

▶️ readline() 의 경우, while 이나 for문을 이용해서 한 행씩 읽어들일 수 있다.

예제 코드

  1. 파일에 저장된 과목별 점수를 파이썬에서 읽어, 딕셔너리에 저장하는 코드를 만들어보자.
scoreDic = {}

uri = '파일디렉토리'

with open(uri + '파일 이름.txt', 'r') as f: # 이미 파일에 과목별 점수가 있다고 하고
	line = f.readline()

	while line != '': # line 을 모두 읽어들일때까지 반복
		tempList = line.split(':') # ':' 를 기준으로 분리해서 리스트에 저장
		scoreDic[tempList[0]] = int(tempList[1].strip('\n')) # '\n'을 삭제해주고 정수형으로 value 값 저장
		line = f.readline()


print(f'scoreDic: {scoreDic}')

🔜 중급 문제 풀이

이제까지 파이썬의 중급 문법들을 다뤄봤다. 다음 시간부터는 본격적으로 중급 문제 풀이를 정리해보도록 하겠다

profile
공부한 내용들에 대해 끄적이는 공간입니다💎

0개의 댓글