[제로베이스] CH1. Python 기초 - 예외처리, 파일입출력

정해성·2023년 6월 13일
0

제로베이스

목록 보기
8/36
post-thumbnail

예외란

예외란 코드 실행 중에 발생한 에러를 뜻한다. 이렇게 발생한 예외 상황을 처리할 수 있도록 프로그램의 흐름을 바꾸는 행위를 예외 처리라고 한다.

예외처리 방법

파이썬에서 예외 처리를 위해 try, except, else, finally를 사용한다.

try:
    실행할 코드
except(~~):
    예외가 발생했을 때 처리하는 코드
    (~~)에 특정 예외 문구를 넣으면 특정 예외만 처리한다.
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
	예외와는 상관없이 항상 코드 실행하기

예외처리 예시

try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x

# 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
except ZeroDivisionError:    
    print('숫자를 0으로 나눌 수 없습니다.')
    
# try의 코드에서 예외가 발생하지 않았을 때 실행됨
else:
    print(y)
    
# 예외 발생 여부와 상관없이 항상 실행됨
finally:                     
    print('코드 실행이 끝났습니다.')

예외 클래스

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

기본 구조

class 예외이름(Exception):
    def __init__(self):
        super().__init__('에러메시지')

예시

class Iszero(Exception): ## Exception을 상속받아야한다.
    def __init__(self):
        super().__init__('0은 사용할 수 없습니다.') ## 부모 객체 초기화 메서드에 원하는 메시지 입력

class NotThreeMultipleError(Exception):
    def __init__(self):
        super().__init__('3의 배수가 아닙니다.')
        
예외를 실행 시킬 땐 "raise 예외문구"로 사용한다.
raise Iszero
raise NotThreeMultipleError
def div():
    try:
        x = int(input('정수를 입력하세요: '))
        
        if x == 0:          # x가 0이면
            raise Iszero    # Iszero 예외를 발생시킴

        if x % 3 != 0:                     # x가 3의 배수가 아니면
            raise NotThreeMultipleError    # NotThreeMultipleError 예외를 발생시킴
	
    # 이때 Exception에 에러 메세지를 넣고 
    # 넣은 에러 메시지는 except Exception as e:의 e에 들어간다.
    except Exception as e:
        print('예외가 발생했습니다.', e)
 
div()

## 출력
정수를 입력하세요: 5
예외가 발생했습니다. 3의 배수가 아닙니다.

정수를 입력하세요: 0
예외가 발생했습니다. 0은 사용할 수 없습니다.

파일 입출력

파이썬에서 파일을 생성하고 읽고 쓰는 파일 입출력 기능이 있다. 파일 관련 함수는 open, close, write, writeline, writelines, read, readline, readlines, seek, tell등의 함수들이 있다.

1. 파일 생성 open, close 함수
2. 파일 쓰기 write, writeline, writelines 함수
3. 파일 읽기 read, readline, readlines, seek, tell 함수

함수 사용법

open, close

def open(file, mode='r'):

# 통상적으로 f 변수를 사용 
f = open('파일경로/파일이름', 'w')

# 파일 닫기
f.close()

모드 설명

  • 'r' : 기본값으로 정해져 있으며 파일을 읽기 위한 옵션.
  • 'w' : 쓰기모드이며 파일에 내용을 쓸 때 사용하는 옵션. 만약 이미 파일이 존재하면 커서를 맨 앞으로 돌리면서 뒤에 내용을 다 잘라내기 때문에 내용이 사라질 수 있음. 파일이 존재하지 않는다면 새롭게 파일을 생성.
  • 'a' : 쓰기모드이며 파일에 내용을 쓸 때 사용하는 옵션. w 옵션과는 달리 이미 파일이 존재하면 그 파일의 끝에 커서가 존재하고, 그 뒤에 이어쓰기가 가능. 즉, 파일 내용을 잘라내지 않고 이어서 쓸 수 있음.
  • 'x' : 파일이 없으면 파일을 생성하고 쓰기모드로 열림. 만약 파일이 있으면 에러를 발생 시킴.

write, writelines

f.write('쓰고 싶은 문자열')

# writelines 함수는 매개변수로 파일에 넣을 문자열 리스트를 받습니다.
f.writelines(['a', 'b', '123', '456'])

### 줄 바꿈은 맨 끝에 개행문자(\n)을 직접 입력 해야함!

read, readline, readlines

f.read(n)
파일 스트림으로 부터 해당 위치의 문자 n개를 읽어오는 함수. (n바이트를 읽어오는 것)
read() 이렇게 아무것도 넣지 않으면 모든 문자를 읽음. (반환 : 문자N개를 반환한다)

f.readlines()
해당 위치에서부터 파일의 모든 문자열을 읽어온다. (개행 포함)
반환 : List[문자열]을 반환한다.


f.readlines()
해당 위치에서부터 파일의 모든 문자열을 읽어온다. (개행 포함)
반환 : List[문자열]을 반환한다.

seek, tell

f.seek(위치)
해당 위치로 파일의 커서를 옮긴다. 파일의 맨 처음 위치는 0이다.

f.tell()
현재 커서의 위치를 반환하는 함수이다.

파일 입출력 예시

test.txt 내용을 다음과 같다 가정한다.

# test.txt
My name is Sam
파일 입출력 공부
123456
abcdef
# 파일 r 모드로 열기
f = open('C:/Test/test.txt', 'r')
'''
UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 23: illegal multibyte sequence
위 에러 발생시
f = open('C:/Test/test.txt', 'rt', encoding='UTF8')
'''

# read() 함수 이용해서 하나씩 읽어오기
print('1. read()')
print(f'위치 : {f.tell()}')
 
s1 = f.read(1)
print(s1,'\n')

# readline() 함수 이용해서 한 라인씩 읽어오기
print('2. readline()')
print(f'위치 : {f.tell()}')
 
s2 = f.readline()
print(s2)

# readlines() 함수 이용해서 모두 읽어오기
print('3. readlines()')
print(f'위치 : {f.tell()}')
 
s3 = f.readlines()
print(s3,'\n')
 
# 맨 처음 위치로 가서 한줄 읽기
print('4. seek(0), readline()')

f.seek(0)
print(f'위치 : {f.tell()}')
 
s4 = f.readline()
print(s4)
 
# 파일 닫기
f.close()
############### 출력 ###############
1. read()
위치 : 0
M 

2. readline()
위치 : 1
y name is Sam

3. readlines()
위치 : 16
['파일 입출력 공부\n', '123456\n', 'abcdef'] 

4. seek(0), readline()
위치 : 0
My name is Sam

with ~ as

파일을 open() 함수를 사용해 열면 close()함수도 필수로 사용해야 한다. 하지만 with ~ as 를 사용하면 f.close()를 하지 않아도 된다.

##기존 open ~ close
f=open('hello.txt','w') #write모드
f.write('Hello Python')
f.close()
## with ~ as

# hello.txt 파일에 입력하기
with open('hello.txt','w') as f:
    f.write('hello Python!!')
    
# hihi.txt 파일의 라인 불러오기
with open('hihi.txt','w') as f:
	f1 = f.readline()
    print(f1)

단, write 안에는 string만 가능하다고 한다. 그래서 str()을 이용해서 type을 변경한 후 f.write를 해야한다.

profile
코린이 공부중

0개의 댓글