제로베이스 데이터 취업 스쿨 - 15일차(6/16)

수야·2023년 6월 17일
0

[연습문제] 예외처리(02)


뭔 쌉소린지 기억이안난다... 다른 예제로 4개 해야겠다..

1번문제

사용자로부터 숫자를 입력받아서 두 숫자를 나누는 프로그램입니다. 그러나 사용자가 0을 입력하거나 숫자가 아닌 값을 입력하는 경우에는 예외를 처리하시오

while True :
    try:
        x = int(input('숫자 1입력'))
        y = int(input('숫자 2입력'))
        print(f'{x} / {y} = {x/y}')
        break
    except ValueError :
        print('숫자를 입력하세요')
    except ZeroDivisionError :
        print('0으로는 나눌 수 없습니다.')
  • gpt가 말하길
    나눗셈 연산 위치: 현재 코드에서는 나눗셈 연산(x/y)을 예외 처리 이전에 수행하고 있습니다. 이 경우, ZeroDivisionError가 발생하면 프로그램이 중단되기 때문에 나눗셈 연산을 수행하기 전에 예외 처리를 해주는 것이 좋습니다.
    그러니까 나는 print 안에 나눗셈을 넣어서 하고있는데 이러지말래.

2번 문제

사용자로부터 파일 이름을 입력받아 해당 파일을 열고 내용을 출력하는 프로그램입니다. 그러나 파일이 존재하지 않는 경우와 파일을 읽는 도중에 예외가 발생하는 경우에는 예외를 처리하여 오류 없이 프로그램이 실행되도록 합니다.


while True :
    try:
        fileName = input('파일 이름을 입력하세요:')
        with open(fileName, 'r') as file:
            contents = file.read()
            print(contents)
        break
    except FileNotFoundError :
        print('파일이 존재 하지 않습니다.')
    except Exception as e :
        print('파일을 읽는 중 에러가 발생했습니다 :',e)

처음에는

while True :
    try:
       file = open('C:/pythonex/project/txt.txt','r')
       file.read()
       file.close()
    except FileNotFoundError:
        print('파일을 찾을 수 없습니다')
    except FileExistsError :
        print('파일이 존재 하지 않습니다.')

이렇게 했음 여기서 문제는 뭐였냐면

  • FileExistsError : 파일을 새로 만들려고 할 때 이미 있는 파일 명을 쓰면 나오는 에러임
    이게 뭔지를 몰랐고
  • 파일 열기 위치: 내가 처음에 쓴 코드에서는 파일을 열고 읽는 부분이 try 블록 안에 있습니다. 하지만 파일이 존재하지 않는 경우에는 파일을 열고 읽는 작업이 실행되지 않아야 합니다. 따라서 파일을 열기 전에 예외 처리를 하도록 코드를 수정해야 한다고 함. 그래서 인풋으로 파일 경로를 받고나서 그다음 단계로 넘겨야함
    한단ㅖ안에서 열어보기 부적절함
    그래서
fileName = input('파일 이름을 입력하세요:')
        with open(fileName, 'r') as file:
            contents = file.read()
            print(contents)

이렇게 파일 경로 받고
파일 여는 변수 넣고
파일 읽어보라하고
파일 내용 도출하라하는
총 4개의 단계로 나누는거임
그래서 with구문에서 에러가 생긴다 하면 file not found Error를 보내는거고,
file.read에서 에러가 생긴다 하면은 아래로 내려가서 exception as e 를 내보내는것.

  • 파일 핸들 닫기: 파일을 열고 읽은 후에는 항상 파일 핸들을 닫아주는 것이 좋다. 내가 쓴 코드에서는 파일 핸들을 닫지 않고 있다고 하네... file close 로 닫은줄 알았는뎅 힝. 그래서 try-finally 블록이나 with 문을 사용하여 파일을 열고 닫아야함. with로 해야겠군

3번 문제

사용자로부터 여러 개의 숫자를 입력받아 평균을 계산하는 프로그램을 작성하되, 잘못된 입력이 있을 경우 해당 입력을 건너뛰고 평균을 계산하는 프로그램입니다.(숫자를 입력하고 결과를 확인할 때마다 입력했던 숫자들을 보여주는 것을 추가 요청함)

from math import  *
numbers = []
count = 0
total = 0
while True :
    try:
        num = int(input('숫자 입력(종료시 0)'))
        if num == 0:
            print('종료합니다.')
            break
        count += 1
        total += num
        numbers.append(num)
        result = total/count
        print(f'입력한 값들의 평균 : {result}')

    except Exception as e :
        print('에러가 발생했습니다', e)
        print('해당 내용을 건너 뜁니다')
    except ValueError:
        print('올바른 숫자를 입력하세요')

    finally:
        print('현재까지 입력된 숫자들 :', numbers)
  • 나는 math에서 average 뽑아볼라고 위에 import math써두고 못지웠는데 이걸 보고
    : from math import * 구문: 현재 코드에서는 math 모듈을 import하고 있지만, 사용되지 않으므로 제거해도 됩니다. 사용하지 않는 import 구문은 코드의 가독성을 떨어뜨릴 수 있습니다.
  • 평균 계산 위치: 현재 코드에서는 매번 숫자를 입력받을 때마다 평균을 계산하고 출력합니다. 이렇게 하면 이전까지 입력된 숫자들의 평균만 출력되고, 새로운 숫자를 입력할 때마다 새로운 평균이 계산되어 출력됩니다. 평균 계산은 종료 후에 한 번만 수행하도록 코드를 수정해야 합니다.
    뭐라는건지 이해는 어렵다면... 그냥 평균을 finally에서 하도록 하라는거같음
  • 오 그리고 Exception 예외 처리: 현재 코드에서는 모든 예외를 Exception으로 처리하고 있습니다. 하지만 예외 처리는 가능한 구체적으로 하는 것이 좋습니다. 예를 들어, ValueError 예외는 숫자가 아닌 값이 입력될 때 발생하므로 이를 구체적으로 처리하는 것이 좋습니다.
    이렇게 말하길래.. 무슨 말인가 하고 보니까
    내가 exceptuon as e를 먼저 쓰고, valueerror를 뒤에 놓으니까, 실제 valueerror인 상황에서 valueerror가 안나오더라고,. 그래서 구체적인 에러를 앞으로 빼고, 그 뒤로 다른 에러가 나올경우 exception as e 로 바꾸라는거였음 ! 신기

여기에 더 나아가서

finally:
    if count > 0:
        result = total / count
        print('입력한 값들의 평균:', result)
    else:
        print('입력된 숫자가 없습니다.')

    print('현재까지 입력된 숫자들:', numbers)

마지막을 이렇게 하라는겨
왜그런가~ 하고 봤더니
숫자 단한번도 입력안해서 건너 뛰면
입력된 숫자가 없다고 말해야해서 그런거였음
키야...

더 나아가서 if 바로 아래로 숫자가 없는걸 넣으면 안되고,
숫자가 있을떄 평균을낼 수 있을때 꺼를 넣어줘야함

4번 문제

파일에서 숫자를 읽어와 합계를 계산하는 프로그램을 작성하세요. 파일에는 한 줄에 하나의 숫자가 들어 있으며, 파일의 끝에는 빈 줄이 있을 수 있습니다. 파일이 존재하지 않는 경우에는 예외를 처리하고, 숫자를 읽을 수 없는 경우에도 예외를 처리하세요. 프로그램은 합계를 계산하여 출력해야 합니다.
<주의 사항>

  • 파일의 경로는 하드코딩하지 말고 사용자에게 입력받아 사용하세요.
  • 파일을 열고 닫는 과정에서 발생할 수 있는 예외를 적절히 처리하세요.

    입력
    파일명 : numbers.txt
    10
    20
    30

출력
숫자 합계: 60


count = 0
total = 0
while True:
    try:
        fileName = input('파일명을 입력하세요: ')

        with open(fileName, 'w') as file:
            print("새 파일을 생성하고 숫자를 입력하세요. 입력을 마치려면 빈 줄을 입력하세요.")
            while True:
                line = input('숫자 입력: ')
                if line == '':
                    break
                try:
                    number = int(line)
                    total += number
                    count += 1
                    file.write(str(number) + '\n')

                except ValueError:
                    print('올바른 숫자를 입력하세요.')

        print(f'숫자 합계: {total}')
        break

    except FileNotFoundError:
        print('파일이 존재하지 않습니다')
    except Exception as e:
        print('에러가 발생하였습니다:', e)

고생 꽤나 했네
gpt샊기도 계속 틀리던데...?

그래서 한문제 더 들어가보자구

5번 문제

사용자로부터 두 개의 파일명을 입력받아, 첫 번째 파일을 읽고 두 번째 파일에 그 내용을 복사하는 프로그램을 작성해보세요. 단, 파일이 존재하지 않는 경우에는 "파일을 찾을 수 없습니다"라는 메시지를 출력하고, 파일을 복사하는 도중에 에러가 발생한 경우에는 "파일 복사 중에 에러가 발생하였습니다"라는 메시지를 출력해야 합니다.
요구 사항:

  1. 사용자로부터 첫 번째 파일명을 입력받아 해당 파일을 읽습니다.
  2. 사용자로부터 두 번째 파일명을 입력받아 해당 파일에 내용을 복사합니다.
  3. 파일이 존재하지 않는 경우에는 FileNotFoundError 예외를 처리하여 "파일을 찾을 수 없습니다"라는 메시지를 출력합니다.
  4. 파일 복사 중에 에러가 발생한 경우에는 IOError 예외를 처리하여 "파일 복사 중에 에러가 발생하였습니다"라는 메시지를 출력합니다.
  5. 모든 예외에 대해 기본적인 예외 처리를 추가하여 "예기치 않은 오류가 발생하였습니다"라는 메시지를 출력합니다.
fileName = input('파일 1 이름 입력')
fileNameCopy = input('파일 2 이름 입력')
try :
    with open(fileName, 'w') as file :
        file = input('파일 내용 입력')

    with open(fileName, 'r') as ori :
        with open(fileNameCopy, 'w') as copy :
            content = ori.read()
            copy.write(content)

except FileNotFoundError :
    print("파일을 찾을 수 없습니다")
except IOError:
    print("파일 복사 중에 에러가 발생하였습니다")
except Exception as e :
    print("예기치 않은 오류가 발생하였습니다")

내가쓴 코드에 대해서

파일 내용을 입력받을 때, file 변수를 재할당하는 부분이 있습니다. 이렇게 하면 파일 객체가 아닌 사용자 입력을 저장하게 되므로, 파일의 내용을 읽어오는 부분에서 에러가 발생합니다. 파일 내용을 입력받을 때 다른 변수를 사용해야 합니다.

파일 복사 부분에서 예외 처리가 누락되어 있습니다. 파일을 열고 내용을 복사하는 과정에서 예외가 발생할 수 있으므로, 해당 예외를 처리해야 합니다.

예외 처리의 마지막 부분에서 Exception을 잡아 처리하고 있지만, 좀 더 구체적인 예외 클래스를 사용하는 것이 좋습니다.

라고 지적해줌 오키!

[연습문제] 텍스트파일(01)

제로 베이스 문제가 어려운건지...
내가 이해를 못하는건지 참


파일 합치기
두 개의 텍스트 파일을 입력 받아, 첫 번째 파일과 두 번째 파일의 내용을 합쳐 세 번째 파일에 저장하는 프로그램을 작성하세요.

file1 = 'file1'
f1content = input('파일 내용 입력')
f2content = input('파일 내용 입력')

with open(file1, 'w') as f1 :
    f1.write(f1content)

file2 = 'file2'
with open(file2, 'w') as f2 :
    f2.write(f2content)

file3 = 'file3'
with open(file1, 'r') as f1, open(file2, 'r') as f2, open(file3, 'w') as f3:
            f3.write(f1.read() + '\n' + f2.read())
            print('파일 합치기 완료')


with open(file3, 'r') as f3:
    print(f3.read())

파일명을 위에서 받고
파일내용도 전에 받고
그걸 ope, write, read했네
그리고 write에 다른거 넣어줄때 아래로 들여쓰기하면서 하는게 아니라 콤마로 이어붙이는거였고,
파일에 다른 파일 내용 복사할때 단 분리할거면 read + '\n' + read하는거였다~

[연습문제] 텍스트파일(02)

import time
from time import  *

total = 0
REmoneybook = 'REmoneybook.txt'
form = '-'*30


while True:
    start = int(input('1.입급 2.출금 3. 종료'))
    if start == 1 :
        income = int(input('입금액입력'))
        incomeItem = input('입금내역 입력')
        total += income
        with open(REmoneybook, 'w') as mb:
            mb.write(form + '\n' + f'[입금] {incomeItem} : {income}원' + '\n' + f'[잔액] : {total}원' + '\n')
        continue
    elif start == 2 :
        outcome = int(input('출금액입력'))
        outcomeItem = input('출금내역 입력')
        total -= outcome
        with open(REmoneybook, 'a') as mb:
            mb.write(form + '\n' + f'[출금] {outcomeItem} : {outcome}원' + '\n' + f'[잔액] : {total}원' + '\n')
        continue
    elif start == 3 :
        print('bye~')
        break

다시쓰는게 open(파일명, 'a')
인줄 몰라따!

[연습문제] 텍스트파일(03)


divisor = 'divisor.txt'
iList = []
while True :
        with open(divisor, 'a') as d :
            num = int(input('0보다 큰 정수 입력(0 입력시 종료)'))
            if num == 0 :
                break
            for i in range(1,num+1):
                if num % i == 0 :
                    iList.append(i)
                    result = f'{i}의 약수 : {iList}'
            d.write(result + '\n')

[연습문제] 텍스트파일(04)


finalList = []
num1 = int(input('1보다 큰 정수 입력'))
num2 = int(input('1보다 큰 정수 입력'))
common = 'common.txt'
while True :
    for i in range(1,min(num1,num2)+1):
        if num1 % i == 0 and num2 % i== 0 :
            finalList.append(i)
    with open(common, 'a') as c :
        result = f'{num1}와 {num2} 의 공약수 {finalList}'
        c.write(result + '\n')
        print('common factor write complete')
        break

[연습문제] 텍스트파일(05)

import math
from datetime import *
from math import *
frute = 3
fish = 4
vegi = 5

startDate = datetime(2021,1,1,10,0,0)

file = 'arrive.txt'
name = '2021년 모둔 선박 입항일'
rutine = frute*fish*vegi//math.gcd(fish,vegi,frute)
with open(file, 'w') as f :
    f.write('2021년 모둔 선박 입항일')
    f.write(str(startDate))

nexttime = startDate + timedelta(days=rutine)
while True:
    with open(file, 'a') as f:
        f.write(f'{nexttime}\n')
    nexttime +=timedelta(days=rutine)
    if nexttime.year >2021:
        break![](https://velog.velcdn.com/images/softwater/post/2e52b1da-76d3-4ed2-862e-f9799a7e4887/image.png)
profile
수야는 코린이에서 더 나아갈거야

0개의 댓글