💬 오늘의 공부시간 PM 11:00~ AM 03:00

단기간에 뛰어난 프로그래머가 되려고 하면 절대 성공할 수 없느니라.
웹서핑하다가 본 글...

저질체력인 나에게는 너무 힘든 싸움이다 ㅠㅠ
몸이 아프니까 노트북도 느릿느릿 버벅이고 아픈것 같은 느낌

그럼에도 불구하고...

오늘도 힘내자 !!

🔥 2주차 todo 리스트 (5/8~5/14)

파이썬 기초문풀4
파이썬 기초문풀5
파이썬 중급1
파이썬 중급2
파이썬 중급3
파이썬 중급4
파이썬 중급5~6
파이썬 중급7
예외처리
try~except~else
finally
Excepption 클래스
파이썬 중급8~9
사용자 Exception 클래스
텍스트 파일 쓰기
텍스트 파일 읽기
텍스트 파일 열기
with ~as문
writelines()
readlines(), readline()

파이썬 중급문풀1~2
파이썬 중급문풀3
파이썬 중급문풀4

📝 weekly 데이터 사이언스 스쿨 퀴즈
📝 재복습weekly 데이터 사이언스 스쿨 퀴즈

💻 핵심 내용 정리

📝 예외란?

  • 문법적인 문제는 없으나 실행 중 발생하는 예상치 못한 문제이다.
  • 예외 관련 클래스는 인셉션 (Excepion) 클래스를 상속한다.

📝 예외처리

  • 예상하지 못한 예외가 프로그램 전체에 영향이 없도록 처리하는 것
  • 발생한 예외에 대해서 별도 처리한다.
  • 예외 발생 예상 구문을 try ~ except 로 감싼다.
  • 예외가 발생 하지 않은 경우에는try ~ except ~ else로 마무리 한다.

실습_01

사용자로 부터 숫자 5개를 입력 받을때, 숫자가 아닌 자료형이 입력되면 예외처리하는 프로그램을 만들어 보자.

# 예외가 발생 할 것 같은 구문

nums = []

n = 1
while n < 6:
    try:
        num = int(input('input number: '))
    except:
        print('예외 발생!!')
        continue

    nums.append(num)
    n += 1

print(f'nums: {nums}')



# 예외가 발생하지 않은 경우 실행하는 경우

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

print(f'nums: {nums}')

📝 Finally()

  • 예외 발생과 상관없이 무조건 실행할때 항상 실행한다.
    외부자원을 가지고 작업을 할때, 자원 해제를 하는 경우

예시

try:
    inputData = input('input number: ')
    numInt = int(inputData)
except:
    print('excception raise!!')
    print('not number!!')
else:
    if numInt % 2 == 0:
        print('even number!!')
    else:
        print('odd number')
finally:
    print(f'putData: {inputData}')

실습_02

사용자로부터 숫자 5개를 입력받아 짝수, 홀수, 실수와  입력한 모든 데이터를 각각 출력하는 프로그램을 만들어보자.

evenList = []; oddList = []; floatList = []; dataList = []

n = 1
while n < 6:

    try:
        data = input('input number:')
        floatNum = float(data)
    except:
        print('exception raise!!')
        print('not number!!')
        continue
    else:
        if floatNum - int(floatNum) != 0:  # 실수
            print('float number!!')
            floatList.append(int(floatNum))
        else:
            if floatNum % 2 == 0:  # 짝수
                print('even number!!')
                evenList.append(int(floatNum)
            else:    # 홀수
                print('odd number!!')
                oddList.append(floatNum)

        n += 1

    finally:
        dataList.append(data)


print(f'evenList: {evenList}')
print(f'oddList: {oddList}')
print(f'floatList: {floatList}')
print(f'dataList: {dataList}')

📝 Exception (인셉션) 클래스

  • 예외담당 클래스라고 이해하자.
  • Exception 클래스를 상속해서 사용자 Exception (인셉션) 클래스를 만들 수 있다

예시

num1 = int(input('input number1:'))
num2 = int(input('input number2:'))

try:
    print(f'num1 / num2 = {num1 / num2}')
except :
    print('0으로 나눌 수 없습니다.')

print(f'num1 * num2 = {num1 * num2}')
print(f'num1 - num2 = {num1 - num2}')
print(f'num1 + num2 = {num1 + num2}')
num1 = int(input('input number1:'))
num2 = int(input('input number2:'))

try:
    print(f'num1 / num2 = {num1 / num2}')
except Exception  as e:
    print('0으로 나눌 수 없습니다.')
    print(f'exception: {e}')

print(f'num1 * num2 = {num1 * num2}')
print(f'num1 - num2 = {num1 - num2}')
print(f'num1 + num2 = {num1 + num2}')

📝 raise 키워드

  • raise 키워드를 이용하면 강제로 예외를 발생시킬 수 있다

예시

def divcalculator(n1, n2):

    if n2 != 0:
        print(f'{n1} / {n2} = {n1 / n2}')
    else:
        raise Exception('0으로 나눌 수 없습니다.')

num1 = int(input('input number1:'))
num2 = int(input('input number2:'))
divcalculator(num1, num2)
def divcalculator(n1, n2):

    if n2 != 0:
        print(f'{n1} / {n2} = {n1 / n2}')
    else:
        raise Exception('0으로 나눌 수 없습니다.')

num1 = int(input('input number1:'))
num2 = int(input('input number2:'))

try:
    divcalculator(num1, num2)
except Exception as e:
    print(f'Exception: {e}')

실습_03

사용자가 문자메세지를 보낼대 10글자 이하면 SMS로 발송하고, 10글자를 초과하면 MMS로 발송하는 프로그램을 예외 처리를 이용해서 만들어 보자.

def sendSMS(msg):

    if len(msg) > 10:
        raise Exception('길이초과!! MMS전환 후 발송!!', 1)
    else:
        print('SMS 발송!!')

def sendMMS(msg):
    if len(msg) <= 10:
        raise Exception('길이 미달!! SMS전환 후 발송!!', 2)
    else:
        print('MMS 발송!!')

msg = input('input message: ')

try:
    sendSMS(msg)
except Exception as e:
    print(f'e: {e.args[0]}')
    print(f'e: {e.args[1]}')

    if e.args[1] == 1:
        sendMMS(msg)
    elif e.args[1] == 2:
        sendSMS(msg)

📝 텍스트 파일

  • open() 파일 열기
  • read() 읽기
  • write() 쓰기
  • close() 파일 닫기

# 쓰기모드 : write()   /  W
- 기존의 문자는 없애고, 새로운 문자로 대치한다.
- 해당하는 파일이 없으면 새로 생성, 있으면 열린다.

file = open('c:pythonTxt/test.txt', 'w')

strCcnt = file.write('Hello world!')
print(f'strCnt: {strCnt}')

fille.close()
# 읽기모드 : read() 읽기  /  R 
- 숫자로 읽던 문자로 읽던 무조건 문자열로 불러온다.

file = open('c:pythonTxt/test.txt', 'r')

strCcnt = file.read()
print(f'str: {str}')

fille.close()

실습_04

다음과 같이 시스템 시간과 일정을 텍스트 파일에 작성해보자.

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') + ']'
todaySchedule = input('오늘 일정: ')

file = open('C:/pythonTxt/test.txt', 'w')
file.write(dateStr + todaySchedule)
file.close()

실습_05

file = open('C:/pythonTxt/about_python.txt', 'r', encoding='UTF8')

str = file.read()
print(f'str: {str})
file.close()

str = str.replace('Python', '파이썬', 2)  # 영문을 한글로 바꿈: 총 3개의 영문에서 2개만 바꾼다.
print(f'str: {str})

file = open('C:/pythonTxt/about_python.txt', 'w')
file.write(str)
file.close()

📝 파일모드

파일 모드는 파일을 어떤 목적으로 open할지 정한다

  • W : 쓰기 전용(파일이 있으면 덮어씌움/삭제됨)
  • a : 쓰기 전용(파일이 있으면 덧붙임/삭제안됨)
  • x : 쓰기 전용(파일이 잇으면 에러발생)
  • r : 읽기 전용(파일이 없으면 에러발생)

실습_06

uri ='C:/pythonTxt/'

def writePrimeNumber(n):
    file = open(uri + 'prime_number.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)

📝 텍스트파일: with ~ as문

  • file.close()라는 구문이 없어도 자동으로 파일을 닫아준다.
  • 파일 닫기를 생략 할 수 있다.

예시

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()
uri = 'C:/pythonTxt/'

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

실습_07

로또번호 생성기 프로그램을 만들고 파일에 번호를 출력해보자.

import random

uri = 'C:/pythonTxt/'

def writeNumber(nums):
    for idx, num in enumerate(nums):
        with open(uri + 'lotto.txt', 'a') as f:
            if idx < (len(nums) - 2):
                f.write(str(nums) + ', ')
            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(f'rNums: {rNums}')

writeNumber(rNums)

📝 텍스트파일: _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')
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) # 중요 _ 반복문을 사용
    
with open(uri + 'languages.txt', 'r') as f:
	print(f.read()) # 콘솔창에서 읽기

실습_08

딕셔너리에 저장된 과목별 점수를 파일에 저장하는 코드를 작성하자.

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')
        
        
print(scoreDic, file=f)  # 입력된 리스트 통째로 가져오는 코드

📝 텍스트파일: _readlines(), readline()

readlines()
파일의 모든 데이터를 읽어서 리스트 형태로 반환한다.
readline()
한 행을 읽어서 문자열로 반환한다.


💡 오늘을 마무리하면서 ...

와 진짜 거짓말 안하고 5번은 본 것 같은 왜케 구조가 헷갈리는지 모르겟다.
더 천천히 쪼개 봐야하나보다.
아니면 아직 내가 아파서 약먹고 몽롱해서 머리에 안들어오는 것일지도...
교수님 정말로 꼼꼼히 설명해주시는것 같은데 머리에 안들어와 ㅠㅠ

😃 Busy Study _ 새벽반 PM 10:00 ~ AM 2:30

여러분 화이팅!! 우리 모두 다 잘 될거예요!

profile
늦깎이 DA/DS 취준생, 이곳은 스터디노트 겸 성장기록장(소통환영이요💜)

0개의 댓글