[제로베이스] 데이터 사이언스 15기 - (05-10 파이썬 중급 스터디노트)

윤태호·2023년 5월 12일
0
post-thumbnail

오늘 수강한 강의 - 파이썬 중급 (30 ~ 39)

30 (try ~ except ~ else) ~ 33 Exception 클래스

~ else

  • 예외가 발생하지 않은 경우 실행하는 구문
nums = []
n = 1
while n < 6:
    try:
        num = int(input('input number: '))
    except:
        print('예외 발생')
        continue

예외가 발생되지 않으면 실행

    else:
        if num % 2 == 0:
            nums.append(num)
            n += 1
        else:
            print('입력한 숫자는 홀수 입니다.', end='')
            print('다시 입력 하세요.')
            continue
  • (실습) 짝수, 홀수, 실수로 구분하여 각각을 리스트에 저장하는 프로그램
eveList = []; oddList = []; floatList = []
n = 1
while n < 6:
    try:
        num = float(input('input number: '))
    except:
        print('exception raise!!')
        print('input number again!!')
        continue
    else:
        if num - int(num) != 0:
            print('float number!')
            floatList.append(num)
        else:
            if num % 2 == 0:
                print('even number!')
                eveList.append(int(num))
            else:
                print('odd number!')
                oddList.append(int(num))
        n += 1
print('eveList: {}'.format(eveList))
print('oddList: {}'.format(oddList))
print('floatList: {}'.format(floatList))

finally

  • 예외 발생과 상관없이 항상 실행한다
try:
    inputData = input('input number: ')
    numInt = int(inputData)
except:
    print('exception raise!!')
    print('not number!!')
    numInt = 0
else:
    if numInt % 2 == 0:
        print('inputData is even number!!')
    else:
        print('inputData is odd number!!')

항상 실행됨

finally:
    print('inputData: {}'.format(inputData))

Exception

  • 예외 담당 클래스 Exception
num1 = int(input('input numer1: '))
num2 = int(input('input numer2: '))
try:
    print('num1 / num2 = {}'.format(num1 / num2))

except Exception as e

except Exception as e:
    print('exception: {}'.format(e))
print(f'num1 * num2 = {num1 * num2}')
print(f'num1 - num2 = {num1 - num2}')
print(f'num1 + num2 = {num1 + num2}')
  • raise 키워드를 이용하면 예외를 발생시킬 수 있다
def divCalculator(n1, n2):
    if n2 != 0:
        print('n1 / n2 = {}'.format(n1 / n2))
    else:
        raise Exception('0으로 나눌 수 없습니다.')
num1 = int(input('input numer1: '))
num2 = int(input('input numer2: '))
try:
    divCalculator(num1, num2)
except Exception as e:
    print('Exception: {}'.format(e))

사용자 예외 클래스

  • Exception 클래스를 상속해서 사용자 예외 클래스를 만들 수 있다

사용자 예외 클래스

class NotUseZeroException(Exception):
    def __init__(self, n):
        super().__init__(f'{n}은 사용할 수 없습니다!!')
def divCalculator(num1, num2):
    if num2 == 0:
        raise NotUseZeroException(num2)
    else:
        print('num1 / num2 = {}'.format(num1 / num2))
num1 = int(input('input number1: '))
num2 = int(input('input number2: '))
try:
    divCalculator(num1, num2)
except NotUseZeroException as e:
    print(e)
  • (실습) 관리자 암호를 입력하고 상태에 따라 예외 처리하는 예외 클래스 만들기
class PasswordLengthShort(Exception):
    def __init__(self, str):
        super().__init__('{}: 길이 5미만!!'.format(str))
class PasswordLengthLong(Exception):
    def __init__(self, str):
        super().__init__('{}: 길이 10초과!!'.format(str))
class PasswordWrong(Exception):
    def __init__(self, str):
        super().__init__('{}: 잘못된 비밀번호'.format(str))
adminPw = input('input admin password: ')
try:
    if len(adminPw) < 5:
        raise PasswordLengthShort(adminPw)
    elif len(adminPw) > 10:
        raise PasswordLengthLong(adminPw)
    elif adminPw != 'admin1234':
        raise PasswordWrong(adminPw)
    elif adminPw == 'admin1234':
        print('빙고!!')
except PasswordLengthShort as e1:
    print(e1)
except PasswordLengthLong as e2:
    print(e2)
except PasswordWrong as e3:
    print(e3)

34 텍스트 파일 쓰기 ~ 36 텍스트 파일 열기

기본 함수

  • open(), read(), wtire(), close()를 이용한 텍스트 파일 다루기

  • write() 함수를 이용해 파일에 문자열 쓰기
file = open('C:/pythonTxt/test.txt', 'w')
strCnt = file.write('Hello world')
print('strCnt = {}'.format(strCnt))
file.close()
  • (실습) 시스템 시간과 일정을 텍스트 파일에 작성
import time
lt = time.localtime()
dateStr = '[' + str(lt.tm_year) + '년 ' + \
          str(lt.tm_mon) + '월 ' +\
          str(lt.tm_mday) + '일] '
todaySchedule = input('오늘 일정: ')
file = open('C:/pythonTxt/test.txt', 'w')
file.write(dateStr + todaySchedule)
file.close()

dateStr 간략하게

dateStr = '[' + time.strftime('%Y-%m-%d %I:%M:%S %p', lt) + '] '

파일 읽기

  • read() 함수를 이용한 파일 문자열 읽기
file = open('C:/pythonTxt/test.txt', 'r')
str = file.read()
print('str = {}'.format(str))
file.close()
  • 텍스트 파일에서 Python을 파이썬으로 변경해서 파일에 다시 저장
file = open('C:/pythonTxt/about_python.txt', 'r')
str = file.read()
print('str = {}'.format(str))
file.close()
str = str.replace('python', '파이썬', 2)
print('str = {}'.format(str))
file = open('C:/pythonTxt/about_python.txt', 'w')
file.write(str)
file.close()

파일 모드

  • 파일 모드는 파일을 어떤 목적으로 open 할지 정한다
uri = 'C:/pythonTxt/'

'w' 파일 모드

file = open(uri + 'hello.txt', 'w')
strCnt = file.write('Hello Python!!')
print('strCnt: {}'.format(strCnt))
file.close()

'a' 파일 모드

file = open(uri + 'hello.txt', 'a')
file.write('\n')
file.write('Hello data science!!')
file.close()

'x' 파일 모드

file = open(uri + 'hello.txt', 'x')
file.write('Nice to meet you!!')
file.close()

'r' 파일 모드

file = open(uri + 'hello.txt', 'r')
str = file.read()
print('str: {}'.format(str))
file.close()
  • (실습) 사용자가 입력한 숫자에 대한 소수를 구하고 이를 파일에 작성
uri = 'C:/pythonTxt/'
def writePrimeNumber(n):
    file = open(uri + 'prime_numbers.txt', 'a')
    file.write(str(n))
    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)

37 (with ~ as) ~ 39 readlines(), readline()

with ~ as문

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

close() 생략가능

with open(uri + '5_037.txt', 'a') as f:
    f.write('python study!!')
with open(uri + '5_037.txt', 'r') as f:
    print(f.read())
  • (실습) 로또 번호 생성기 프로그램
import random
uri = 'C:/pythonTxt/'
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)
print('rNums: {}'.format(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(item + '\n' for item in languages)
  • (실습) 딕셔너리에 저장된 과목별 점수를 파일에 저장
scoreDic = {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}
uri = 'C:/pythonTxt/'
for key in scoreDic.keys():
    with open(uri + 'scoreDic.txt', 'a') as f:
        f.write(key + '\t: ' + str(scoreDic[key]) + '\n')

readlines()

  • 파일의 모든 데이터를 읽어서 리스트 형태로 반환한다
uri = 'C:/pythonTxt/'
with open(uri + 'lans.txt', 'r') as f:
    lanList = f.readlines()
print('lanList: {}'.format(lanList))
print('lanList type: {}'.format(type(lanList)))

readline()

  • 한 행을 읽어서 문자열로 반환 한다
uri = 'C:/pythonTxt/'
with open(uri + 'lans.txt', 'r') as f:
    line = f.readline()
    while line != '':
        print('line: {}'.format(line))
        line = f.readline()
  • (실습) 파일에 저장된 과목별 점수를 파이썬에서 읽어 딕셔너리에 저장
scoreDic = {}
uri = 'C:/pythonTxt/'
with open(uri + 'scores.txt', 'r') as f:
    line = f.readline()
    while line != '':
        tempList = line.split(':')
        scoreDic[tempList[0]] = int(tempList[1].strip('\n'))
        line = f.readline()
print('scoreDic: {}'.format(scoreDic))
profile
데이터 부트캠프 참여중

0개의 댓글