Day14. 파이썬 중급 (8~9)

Junghwan Park·2023년 4월 21일
0

스터디노트

목록 보기
15/54

사용자 Exception 클래스

  • 사용자 예외 클래스
    예외 클래스를 직접 만들어보자!
    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문
    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()
    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()

  • 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()

이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.

profile
안녕하세요 반갑습니다^^

0개의 댓글