오늘은 Chapter10에 대해서 공부해보도록 하자~ Title에서 알 수 있듯이 Files와 Exceptions에 대해서 나오는 모양이다. Files는 자주 쓰이지는 않지만 알아두면 좋은 내용이고 Exceptions은 나중에 코드를 작성할 때 꼭 있어야 하는 기능이기 때문에 주의깊게 보고 넘어가도록 하자. 그러면 먼저 Files에 대해서 알아보자.

 

  • Reading from a File

 우리는 지금까지 파이썬 파일(.py)에 대해서만 다루고 있었다. 하지만 이번 챕터에서는 파이썬 파일뿐만 아니라 다른 파일을 참조하여 data를 읽고 쓰는 법에 대해서 배울 것이다. 가장 간단한 예제로 메모장(.txt) 파일을 읽고 쓰는 법에 대해서 알아보자.
 일반적으로 메모장은 간단한 필기나 내용을 적기 위해 사용해왔다. 그러면 이러한 메모장 파일에서 data를 가져오는 방법에 대해서 아래 예제를 살펴보고 알아보자.

 

pi_digits.txt

3.1415926535
  8979323846
  2643383279
with open('pi_digits.txt') as file_object:      # pi_digits.txt 파일 open
    contents = file_object.read()               # open한 파일을 contents에 읽기
print(contents)

결과
3.1415926535
  8979323846
  2643383279

 

 결과와 같이 pi_digits.txt의 data가 출력되는 것을 볼 수 있다. debug를 해서 살펴보면 개행(Enter)에 대해서는 문자 중간중간에 '\n'으로 삽입이 되어있는 한 줄 짜리 긴~ string type으로 되어있다. 열고자 하는 파일에 대해서는 파이썬 파일이 존재하는 곳에 같이 있어야 하며 그 경로가 다른 경우에는 따로 열고자 하는 파일의 경로를 지정하고 열어야 한다.(그렇지 않으면 FileNotFoundError!!)


 * 경로 사이에는 슬래시(/)를 써야하지만 역슬래시(\)를 써도 상관없다. 하지만 역슬래쉬(\) 같은 경우에는 escape로 사용되는 경우도 있기 때문에 두 번(\\) 사용하는 것이 올바르다.

 다음으로는 파일을 읽는 방법에 대하여 관련된 method들을 배워보도록 하자. 가장 자주 쓰이는 method는 총 2가지가 있다. strip(), replace() 2개가 있으며 이보다 더 많은 method들이 있지만 그에 관해서는 구글링을 해보도록 하자!!^^

  • strip()

 strip() method는 기본적으로 공백(' ')이나 개행('\n')을 없애주는 기능을 가지고 있다. 우리가 어떤 파일에서 여러 줄의 data를 가져올 때 문제점이 개행이 추가되어 있는 경우가 있다. 이때에는 print() 함수 자체에도 개행이 들어가 있기 때문에 2번씩 띄어지는 경우가 발생한다. 그렇기 때문에 다른 파일에서 가져온 data의 개행은 지워주는 게 편할 때가 많다. 아래 예제를 살펴보고 strip()의 사용법에 대해 알아보자.

 

qqq3.123213qqq						# pi_digits.txt

with open('file\\pi_digits.txt') as file_object:  	# pi_digits.txt 파일 open
    for line in file_object:
        print(line.strip('q'))				# strip('x') : 처음과 끝에서 x 삭제
        print(line.lstrip('q'))				# 왼쪽(처음)만 삭제
        print(line.rstrip('q'))				# 오른쪽(끝)만 삭제

결과
3.123213
3.123213qqq
qqq3.123213

 

  • replace()

 replace() method는 앞서 배웠던 strip()의 단점을 극복한 method이다. strip()은 처음과 끝의 지정된 문자만 지우고 중간에 들어가 있는 특정 문자는 지울 수 없다. 하지만 replace()는 특정 문자를 전부 찾아서 수정하는 기능을 가지고 있다. 중첩해서 사용할 수도 있으며 순서에 맞게 실행된다. 아래 예제를 살펴보고 replace()의 사용법에 대해 알아보자.

 

qqq3.123213qqq							# pi_digits.txt

with open('file\\pi_digits.txt') as file_object:     		# pi_digits.txt 파일 open
    for line in file_object:
        print(line.replace('q', '0').replace('0', '1'))		# replace('x', 'a') : x를 a로 치환
        print(line.replace('0', '1').replace('q', '0'))		# 앞의 replace()부터 실행

결과
1113.123213111
0003.123213000

 

  • Writing to a File

 앞서 파일을 읽는 방법에 대해서 알아봤으니 다음은 쓰는 방법에 대해 알아보자. 방밥은 매우 비슷하기 때문에 크게 어려운 점은 없다. 아래 예제를 살펴보고 파일에 data를 쓰거나 만드는 방법에 대해서 알아보자.

 

filename = 'programming.txt'			# 파일 이름 지정
with open(filename, 'w') as file_object:	# 파일 오픈
    file_object.write("I love programming.")	# 파일 data 저장

결과
programming.txt 파일 생성(이미 존재 시 내용 변경)
I love programming.

 

 읽는 방식과 동일하나 파일을 오픈할 때 'r'이 아닌 'w'로 설정해줘야 한다는 것이 다른 점이다. 위에서는 생략됬으나 기본값이 'r'이기 때문에 생략한 것이다. 형식을 'w'로 하는 경우에는 파일의 내용을 추가하는 것이 아니라 수정하는 것이기 때문에 이미 입력된 data가 날아갈 수 있는 위험도 있다. 그렇기 때문에 이미 만들어진 파일에 data를 추가하려면 형식을 'w'가 아닌 'a'로 지정해야 한다. 아래 예제를 살펴보고 파일에 내용을 추가하는 방법에 대해 알아보자.

 

filename = 'programming.txt'
with open(filename, 'a') as file_object:			# 'a' : 파일 내용 추가
    file_object.write("I love creating new games \n")		# '\n'을 직접 추가해줘야 한다

결과
"""programming.txt"""

I love programming.
I loveI love creating new games 

 

  • Exceptions

 Exceptions은 흔히 예외 처리라고 하며 우리가 지금까지 코딩하면서 혹은 앞으로도 코딩하면서 수많은 Error들에 대해서 보게 될 것이다. 하지만 그러한 error가 발생할 때마다 프로그램이 멈추고 다운된다면 얼마나 스트레스를 받겠는가...그리고 특정 error에 대해서는 왜 발생한지도 모른 채 찾아봐야 되는 수고스러움도 발생할 것이다.
 이러한 상황을 해결하기 위한 것이 Exceptions이다. 자신이 작성한 코드에서 어떤 부분을 잘못 입력하면 어떠한 error가 뜨는지 알고 그 error를 대처하기 위한 문장이나 처리를 미리 해놓는 것이다. 그렇게 되면 다른 사람이 봐도 왜 발생하고 어떻게 해결해야 하는지 찾기 쉽고 해결하기 쉬울 것이다.
 * 항상 설명하지만 코드는 지금은 혼자서 작성하지만 나중에는 여러 명이서 같이 하는 프로젝트 형식을 많이 가지게 된다. 그렇기 때문에 나만 보기 편한 게 아니라 상대방도 보기 쉬운 가독성이 좋아야 한다.

 그러면 아래 예제를 살펴보고 exception을 사용하는 방법에 대해 알아보자.

 

try:
    print(5/0)				# ZeroDivisionError 에러 발생
except ZeroDivisionError as e:		# 해당 에러 종류에 대한 처리 / e : 에러 내용
    print('"{0}"라는 에러 발생! \n'	# 에러 없이 해당 구간 실행
          '0 쓰지 마세요'.format(e))
          
결과
"division by zero"라는 에러 발생! 
0 쓰지 마세요

 

 자! 출력 결과를 살펴보자. 원래는 코드가 멈추고 에러가 떠야 정상이지만 미리 에러에 대한 대처를 했기 때문에 어떤 에러인지 더 알기 쉽고 해결할 수 있게 된다. try: except: 형식을 가지고 있고 굳이 에러명을 적지 않아도 에러가 발생하게 되면 except문으로 넘어가게 된다. 다음엔 조금 더 발전되서 에러가 발생하지 않았을 때나 무조건 실행하는 else: 와 finally: 에 대해서 아래 예제 코드를 살펴보고 알아보자.

 

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드
--------------------------------------------------------------------------
try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)
finally:                     # 예외 발생 여부와 상관없이 항상 실행됨
    print('코드 실행이 끝났습니다.')
    
결과
나눌 숫자를 입력하세요: 2
5.0
코드 실행이 끝났습니다.

 

 각각의 발생 상황은 위와 같이 되어있으며 상황에 맞게 구현할 수 있다. 마지막으로 우리가 직접 예외를 발생시킬 수도 있는데 이 때 사용하는 기능이 raise이다. 위에서는 예외가 발생이 됬을 때 조치를 취하는 형태의 코드를 만들었지만 지금부터는 예외가 발생할 것 같은 상황에 미리 예외를 발생시키고 처리를 하는 것이다. 아래 예제를 살펴보고 예제를 미리 발생시키는 방법에 대해 알아보자.

 

try:
    x = int(input('3의 배수를 입력하세요: '))
    if x % 3 != 0:					# x가 3의 배수가 아니면
        raise Exception('3의 배수가 아닙니다.')		# 예외를 발생시킴
    print(x)
except Exception as e:                          	# 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.', e)
    
결과
3의 배수를 입력하세요: 2
예외가 발생했습니다. 3의 배수가 아닙니다.

 

 그 뒤에 나오는 Storing Data는 약간의 응용이기 때문에 따로 다루지 않겠다. 자! 이로써 이 책에서 나오는 기본 개념에 대해서는 모두 공부를 마친 것 같다. 마지막 장에서는 지금까지 배운 코드를 응용한 테스트와 어떻게 하면 더 효율적인 코드, 유지 보수가 좋은 코드를 만들 수 있는지에 대한 방법 등이 나오는 것 같다. 코드는 짜는 건 어떻게든 짤 수 있지만 그 코드에 살을 붙여 눈덩이처럼 커지게 되기 때문에 관리를 잘 하는 것도 매우 중요하다고 생각한다. 그러면 지금까지의 내용들을 잘 숙지하고 마지막 장을 넘어가보도록 하자!

 

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter8-2. Function++  (0) 2020.05.13
Chapter9. Classes  (0) 2020.05.08
Chapter8. Functions  (0) 2020.04.28
Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
블로그 이미지

Mr.HB

프로그래밍 이야기

,