[8일차] 파이썬 중급8~9

하은·2023년 10월 25일
0

033. 사용자 예외 클래스

예외 클래스를 직접 만들어보자

- 사용자 예외 클래스

- Exception 클래스를 사용해서 사용자 예외 클래스를 만들 수 있다.

class NotUseZeroException(Exception):

    def __init__(self, n):
        super().__init__(f'{n}은(는) 사용할 수 없습니다.')#상위클래스에 있는 __init__ 메서드 선언

def divCalculator(n1, n2): #실제사용. 함수 만들기

    if n2 == 0:
        raise NotUseZeroException(n2)
    else:
        print(f'{n1} / {n2} = {n1 / n2}')

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

try:
    divCalculator(num1, num2)
except NotUseZeroException as e:
    print(e)

실습) 관리자 암호를 입력하고 다음 상태에 따라 예외 처리하는 예외 클래스를 만들어보자

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 password: ')

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

except PasswordLengthShortException as e1:
    print(e1)
except PasswordLengthLongException as e2:
    print(e2)
except PasswordWrongException as e3:
    print(e3)

실무에서 상황에 맞춰 클래스를 만들어서 많이 쓴다.


034. 텍스트 파일 쓰기

텍스트 파일을 파이썬으로 다뤄보자

- 기본 함수

- open(), read(), write(), close()

텍스트 파일 - 파일열기 - 읽기 또는 쓰기 - 파일 닫기

- 파일 쓰기

- write()함수를 이용한 파일에 문자열 쓰기

외부자원에 대한 디렉토리를 결정해야함

open('C:/pythonTxt/test.txt', 'w')
  • 파일을 오픈할 때 매개변수(인수) 2개를 작성해야한다.
    1) 어느 디렉토리에, 어느 파일을 읽거나 쓰겠냐 = 디렉토리명
    2) 쓰기와 읽기 = 파일의 모드
file = open('C:/Users/User/Desktop/python_ex/pythonTxt/test.txt', 'w')
#역슬레시를 /로 바꿔줘야 한다
#만약 경로에 아무 파일도 없는데 * w모드 * 로 열면 파일을 새로 생성함

strCnt = file.write('Hello python') #기존의 글을 지우고 새로운 글로 덮어버린다
print(f'strCnt: {strCnt}')

file.close()

-->
strCnt: 12

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

import time

lt = time.localtime()

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

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

3) dateStr = '[' + time.strftime('%Y-%m-%d %I:%M:%S %p') + ']' #I는 13시->1시

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

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

--> 
1) [2023년 10월 25일]study

2) [2023-10-25 14:33:56 PM]STUDY

3) [2023-10-25 02:32:38 PM]STUDY

035. 텍스트파일 읽기

텍스트파일의 텍스트를 읽어보자

- 파일 읽기

- read() 함수를 이용한 파일 문자열 읽기

file = open('C:/Users/User/Desktop/python_ex/pythonTxt/test.txt', 'r')

두가지 매개변수 작성해서 열기

file = open('C:/Users/User/Desktop/python_ex/pythonTxt/test.txt', 'r')

str = file.read() #무조건 문자열로 인식함
print(f'str = {str}')

file.close()

-->
str = [2023-10-25 14:33:56 PM]STUDY

실습) 다음 텍스트 파일에서 'Python'을 '파이썬'으로 변경해서 파일에 다시 저장해보자

file = open('C:/Users/User/Desktop/python_ex/pythonTxt/about_python.txt', 'r')

str = file.read()
print(f'str = {str}')  # 읽고

file.close()  # 닫음

str = str.replace('Python', '파이썬', 2) 
# = 글자 바꾸는 함수 '' 를, '' 로, 2개만 바꾸겠다, 다시 할당
print(f'str = {str}')  # 단어 대체

file = open('C:/Users/User/Desktop/python_ex/pythonTxt/about_python.txt', 'w')  # 다시 열기
file.write(str)  # 내용 변경
file.close()  # 닫기

036. 텍스트파일 열기 모드

텍스트파일을 다양한 방식으로 open 할 수 있다.

- 파일 모드

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

  • w : 쓰기 전용(파일이 있으면 덮어씌움)
    파일이 없으면 새로 만듬, 기존의 내용을 날림
  • a : 쓰기 전용(파일이 있으면 덧붙임)
    w와 비슷. 파일의 내용 다음에 새로운 글을 씀
  • x : 쓰기 전용(파일이 있으면 에러 발생)
    파일이 없어야 함. 새로 만들어서 쓰는 모드
  • r : 읽기 전용(파일이 없으면 에러 발생)
url = 'C:/Users/User/Desktop/python_ex/pythonTxt/'

# 'w' 파일  모드
file = open(url + 'hello.txt', 'w')
file.write('hello python')
file.close

# 'a' 파일 모드
file = open(url + 'hello.txt', 'a')
file.write('\n nice to meet you') 
# \n = 개행
#file.close

# 'x' 파일 모드
file = open(url + 'hello_01.txt', 'x')
file.write('\n nice to meet you') # 기존에 파일 존재하면 오류남
file.close

# 'r' 파일 모드
file = open(url + 'hello_01.txt', 'r')
str = file.read()
print(f'str = {str}')
file.close

실습) 사용자가 입력한 숫자에 대한 소수를 구하고 이를 파일에 작성해보자

url = 'C:/Users/User/Desktop/python_ex/pythonTxt/'

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

중첩반복문 복습해야겠다 이해 안 됨 흑ㅎㄱ


037. with~as문

파일 닫기(close)를 생략하자

- with ~ as문

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

= 자동화

uri = 'C:/Users/User/Desktop/python_ex/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 open(uri + '5_037.txt', 'a') as f: # 오픈된 파일을 f라 부르겠다
    f.write('python study')

with open(uri + '5_037.txt', 'r') as f: 
    print(f.read())

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

import random

uri = 'C:/Users/User/Desktop/python_ex/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))

rNums = random.sample(range(1, 46), 7) #범위 1부터 45까지의 숫자를, 7개 뽑는다
# 나온 리스트를 변수에 할당한다
print(f'rNums: {rNums}')

writeNumbers(rNums) #함수에 넘겨줌

-->
9, 6, 27, 31, 43, 24
Bonus: 21

038. writelines()

반복가능한 자료형의 데이터를 파일에 쓰자

- writelines()

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

languages = ['c/c++', 'java', 'c#', 'python', 'javascript']
#[] = 리스트
#() = 튜플 = 수정은 안 되지만 조회는 가능

uri = 'C:/Users/User/Desktop/python_ex/pythonTxt/'
for item in languages:
    with open(uri + 'languages.txt', 'a') as f:
        f.write(item)
        f.write('\n')

-->
c/c++
java
c#
python
javascript

=

#writelines
uri = 'C:/Users/User/Desktop/python_ex/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())

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

uri = 'C:/Users/User/Desktop/python_ex/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')
        # key = '문자' , scoreDic[key] = 숫자
        
-->
kor	:85
eng	:90
mat	:92
sci	:79
his	:82
#딕셔너리 그대로 출력하려면
scoreDic = {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}
with open(uri + 'scores.txt', 'a') as f:
    print(scoreDic, file=f) #파일 옵션만 주면 됨
    
-->
{'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}
# 리스트도 됨
scoreList = [85, 90, 92, 79, 82]
with open(uri + 'scoresList.txt', 'a') as f:
    print(scoreList, file=f)

-->
[85, 90, 92, 79, 82]

039. readlines(), readline()

여러 줄 읽기와 한 줄 읽기

- readlines()

- 파일의 모든 데이터를 읽어서 리스트 형태로 반환한다

- readline()

- 한 행을 읽어서 문자열로 반환한다

# readlines()

uri = 'C:/Users/User/Desktop/python_ex/pythonTxt/'
 
with open(uri + 'lans.txt', 'r') as f:
    lanList = f.readlines()

print(f'lanList: {lanList}')
print(f'type(lanList): {type(lanList)}')

-->
lanList: ['c/c++\n', 'java\n', 'python\n', 'javascript\n', 'R\n']
type(lanList): <class 'list'>
# readline()

with open(uri + 'lans.txt', 'r') as f:
    line = f.readline()

    while line != '': #비어있지않다면 반복해서 출력
        print(f'line: {line}', end='')
        line = f.readline() #다음행으로 가서 다시 한번 읽음

#print내부에도, line 행 끝에도 개행이 하나씩 있어서 공백이 있는 것

-->
line: c/c++
line: java
line: python
line: javascript
line: R

실습) 파일에 저장된 과목별 점수를 파이썬에서 읽어, 딕셔너리에 저장하는 코드를 만들어보자

scoreDic = {} #최종 저장이 딕셔너리기 때문에 비어있는 걸 하나 만들어줌

uri = 'C:/Users/User/Desktop/python_ex/pythonTxt/'
with open(uri + 'scores.txt', 'r') as f:
    line = f.readline()

    while line != '':
        tempList = line.split(':') 
        #split : ' '안에 들어있는 걸 구분자로 해서 리스트로 분리시켜줌
        
        #print(f'tempList: {tempList}')
        #tempList: ['kor', '85\n']
        #tempList: ['eng', '90\n']
        #tempList: ['mat', '92\n']
        #tempList: ['sci', '79\n']
        #tempList: ['his', '82']
        # 이렇게 나옴 
        -> \n을 없애야 하고, 문자열로 인식되는 숫자를 int로 바꿔야

        scoreDic[tempList[0]] \
            = int(tempList[1].strip('\n'))
        #scoreDic[tempList[0]] : 인덱스 0인 값이 key값 되도록
        #tempList[1]:인덱스 1인 값이 value값되도록, strip = 값없애는 함수

        line = f.readline()

print(f'scoreDic: {scoreDic}')

-->
scoreDic: {'kor': 85, 'eng': 90, 'mat': 92, 'sci': 79, 'his': 82}

0개의 댓글