[Python] 파일 입출력과 예외처리 연습문제

미남로그·2021년 10월 21일
1

연습 문제 출처: 📕 초보자를 위한 파이썬 300제
연습 문제 풀이: 기초 300 문제 같이 풀어보기 291번부터 300번까지



291 ~ 300

291 파일 쓰기

바탕화면에 '매수종목1.txt' 파일을 생성한 후 다음과 같이 종목코드를 파일에 써보세요.

005930
005380
035420

f = open('C:/Users/Desktop/매수종목1.txt', 'wt', encoding='utf-8)
f.write('005930\n')
f.write('005380\n')
f.write('035420\n')

정답👏 이 아니라 ... f.close()를 안 해주었습니다.

f = open('C:/Users/Desktop/매수종목2.txt', 'wt', encoding='utf-8)
f.write('005930\n')
f.write('005380\n')
f.write('035420\n')
f.close()

쩝😅 열면 닫자. 열면 닫자. 열면 닫자.


292 파일 쓰기

바탕화면에 '매수종목2.txt' 파일을 생성한 후 다음과 같이 종목코드와 종목명을 파일에 써보세요.

005930 삼성전자
005380 현대차
035420 NAVER

f = open('C:/Users/Desktop/매수종목2.txt', 'wt', encoding='utf-8)
f.write('005930 삼성전자\n')
f.write('005380 현대차\n')
f.write('035420 NAVER\n')
f.close()

정답 👏


293 CSV 파일 쓰기

바탕화면에 '매수종목.csv' 파일을 생성한 후 다음과 같이 종목코드와 종목명을 파일에 써보세요. 인코딩은 'cp949'를 사용해야합니다.

f = open('C:/Users/Desktop/매수종목.csv', 'wt', encoding='cp949')

엑... 이건 배운게 맞을까요?

csv 파일을 사용하는 방법에 대한 게시글을 찾았습니다. 점프투파이썬에서 배우진 않았어도 알아야 하는 것 같네요😭 당장 달려가서 보기

import csv

f open('C:/Users/Desktop/매수종목.csv', 'wt', encoding='cp949', newline='')
writer = csv.writer(f)
writer.writerow(['종목명', '종목코드', 'PER'])
writer.writerow(['삼성전자', '005930", 15.59])
writer.writerow(['NAVER', '035420', 55.82])
f.close()

라고 합니다.

※ csv 모듈에서 데이타를 쓸 때 각 라인 뒤에 빈 라인이 추가되는 문제가 있는데, 이를 없애기 위해 (파이썬 3 에서) 파일을 open 할 때 newline='' 와 같은 옵션을 지정해줘야 한다.


294 파일 읽기

바탕화면에 생성한 '매수종목1.txt' 파일을 읽은 후 종목코드를 리스트에 저장해보세요.

005930
005380
035420

f = open('C:/Users/Desktop/매수종목1.txt', 'wt', encoding='utf-8)
lines = f.readlines()

codes = []
for line in lines:
	code = line.strip() # '\n'
    codes.append(code)
    
print(codes)

f.close()

😳...

파일 안의 모든 내용을 읽어오는 readlines를 사용하여 lines에 담아주었고, for문 반복을 통해 strip을 통해 줄바꿈을 없애주었고, code에 담은 걸 codes란 빈 리스트에 추가해주었습니다.

와우👏


295 파일 읽기

바탕화면에 생성한 '매수종목2.txt' 파일을 읽은 후 종목코드와 종목명을 딕셔너리로 저장해보세요. 종목명을 key로 종목명을 value로 저장합니다.

005930 삼성전자
005380 현대차
035420 NAVER

f = open('C:/Users/Desktop/매수종목2.txt', 'r', encoding='utf-8)
lines = f.readlines()

dicts = {}
for line in lines:
	line = line.strip() # '\n' 제거
    k, v = line.split()
    # print(k,v)
    dicts[k] = v
    
print(dicts)
f.close()

위와 같이 모든 내용을 읽어와서 lines에 담습니다. 빈 딕셔너리 dicts를 만들어 주었습니다. strip을 통해 줄바꿈 제거, split을 통해 공백 제거를 해주었고, 딕셔너리의 key, value를 dicts[k] = v를 통해 key를 value로 저장해주는 과정을 거칩니다.

😳...어렵네요!


296 예외처리

문자열 PER (Price to Earning Ratio) 값을 실수로 변환할 때 에러가 발생합니다. 예외처리를 통해 에러가 발생하는 PER은 0으로 출력하세요.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(i))
per = ["10.31", "", "8.00"]

for i in per:
	try:
    	    print(float(i))
	except:
	    print(0)

정답👏


297 예외처리 및 리스트에 저장

문자열로 표현된 PER 값을 실수로 변환한 후 이를 새로운 리스트에 저장해보세요.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(per))
per = ["10.31", "", "8.00"]

new_per = []
for i in per:
	try:
    	    data = float(i)
            
	except:
	    data = 0
    	new_per.append(data)
        
print(new_per)

정답👏


298 특정 예외만 처리하기

어떤 값을 0으로 나누면 ZeroDivisionError 에러가 발생합니다. try ~ except로 모든 에러에 대해 예외처리하지 말고 ZeroDivisionError 에러만 예외처리해보세요.

try:
	b = 3 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

정답👏


299 예외의 메시지 출력하기

다음과 같은 코드 구조를 사용하면 예외 발생 시 에러 메시지를 변수로 바인딩할 수 있습니다.

try:
    실행코드
except 예외 as 변수:
    예외처리코드 

리스트의 인덱싱에 대해 에러를 출력해보세요.

data = [1, 2, 3]

for i in range(5)
    print(data[i])
data = [1, 2, 3]

for i in range(5):
	try:
    	    print(data[i])
        except IndexError as e:
            print(e)

정답👏


300 try, except, else, finally 구조 사용해보기

파이썬 예외처리는 다음과 같은 구조를 가질 수 있습니다.

try:
    실행 코드
except:
    예외가 발생했을 때 수행할 코드
else:
    예외가 발생하지 않았을 때 수행할 코드
finally:
    예외 발생 여부와 상관없이 항상 수행할 코드

아래의 코드에 대해서 예외처리를 사용하고 try, except, else, finally에 적당한 코드를 작성해봅시다. else와 finally는 적당한 문구를 print하시면 됩니다.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(per))

작성한 코드 👇

per = ["10.31", "", "8.00"]

for i in per:
    try:
        print(float(i))
    except:
        print(0)
    else:
        print("실수로 변환 성공")
    finally:
        print("문자열은 실수 변환이 불가능합니다!")   

정답에 제시된 코드

per = ["10.31", "", "8.00"]

for i in per:
    try:
        print(float(i))
    except:
        print(0)
    else:
        print("clean data")
    finally:
        print("변환 완료")

구조가 같으니 잘 한 것 같군요!

정답👏

저는 try, except, else, finally 구조에 많이 익숙해질 연습이 필요해보입니다.


그래도 모두

profile
미남이 귀엽죠

0개의 댓글