본문으로 바로가기

[Python] 파일과 예외

category Data Science/Python 2015.02.23 18:13

코드에 있는 리스트 데이터를 처리하는 것만으로는 부족합니다.

데이터를 프로그램에 쉽게 가져올 수 있어야 하고 외부 데이터를 사용할 때 잘못될 수 있는 경우도 생각해야 합니다. 그렇게 때문에 예외 처리를 사용하는 것입니다. 

 

파이썬의 기본 입력 메커니즘은 라인을 기반으로 합니다. 데이터를 텍스트 파일에서 프로그램으로 읽어 들이면 한 번에 한 라인씩 가져옵니다.

 

sketch.txt 

Man: Is this the right room for an argument?
Other Man: I've told you once.

Other Man: Now let's get one thing quite clear: I most definitely told you!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh no you didn't!
Other Man: Oh yes I did!
Man: Oh look, this isn't an argument!
(pause)
Other Man: Yes it is!

 

데이터 읽기
>>> data = open(‘sketch.txt’)
>>> print(data.readline(), end=’’)
Man: Is this the right room for an argument?
>>> print(data.readline(), end=’’)
Other Man: I've told you once.
>>> data.seek(0)
0
>>> for each_line in data:
    Print(each_line, end=’’)
Man: Is this the right room for an argument?
Other Man: I've told you once.
....
 
cs

물론 sketch.txt 파일이 현재 경로가 아닌 다른 경로에 있다면 해당경로를 포함시켜야 합니다.

그리고 print문에 end=''는 줄바꿈을 제거 하겠다는 의미입니다.

 

· open() : 파이썬 내장함수로 파일을 연결한다.

· seek() : 읽고있는 파일의 위치를 이동시킨다.

· split() : 구분자를 가지고 양쪽의 데이터를 분할한다.

 

for문을 사용하여 텍스트를 수정하여 출력

data = open(‘sketch.txt')
for each_line in data:
    if each_line.find(':') >= 0:
        (role,line_spoken)=each_line.split(':',1)
        print(role, end='')
        print(' said: ', end='')
        print(line_spoken, end='')
data.close()
cs

 

여기서 split(':', 1)에서의 1은 분할 수를 정하는 것입니다. 만약 split(':')를 사용하면 분할 수를 정하지 않고 모두 분할을 하게 됩니다.

또한 (role,line_spoken)=each_line.split(':',1)에서 처럼 파이썬은 동시 대입이 가능합니다. 동시에 변수 2개에 2개의 데이터를 넣어 준다는 의미입니다.

 

IDLE 셀에서는 help() 내장 함수를 사용해서 파이썬 문서에 접근할 수 있습니다.

만약 split() 함수에 대한 도움말을 확인하기 위해서는 아래와 같이 확인할 수 있습니다.

>>> color = 'red:blue:yellow'
>>> help(color.split)
Help on built-in function split:
 
split(...) method of builtins.str instance
    S.split(sep=None, maxsplit=-1-> list of strings
    
    Return a list of the words in S, using sep as the
    delimiter string.  If maxsplit is given, at most maxsplit
    splits are done. If sep is not specified or is None, any
    whitespace string is a separator and empty strings are
    removed from the result.
 
cs

 

예외 처리

파이썬도 다른 언어와 마찬가지로 예외처리를 지원합니다.

try

런타임 에러를 발생 시킬 수도 있는 코드

except:

정의한 에러 복구 코드(그냥 지나가고 싶다면 pass문 사용)

try
data = open(‘sketch.txt')
for each_line in data:
    if each_line.find(':') >= 0:
    try:
         (role,line_spoken)=each_line.split(':',1)
         print(role, end='')
         print(' said: ', end='')
         print(line_spoken, end='')
    except:
      pass
data.close()
except:
  print(‘파일이 없습니다.’)
cs

만약 예외 처리 코드가 특정한 에러만을 고려하여 처리하도록 되어 있다면 except 문에 에러 종류를 지정해야 합니다. 에러 종류를 지정하면 예외 처리 코드가 범용에서 특정형으로 바뀝니다.

 

 

except IOError:

except ValueError:

 

모든 런타임 에러를 처리할 수 있는 것도 좋지만, 너무 범용적으로 만드는 건 좋지 않은 생각입니다. 코드를 실행할 때 IOError와 ValueError 외에 또 어떤 에러가 생길 수 있는지 알고 싶을 수도 있을 겁니다. 만약 다른 에러가 발생했을 때에는 범용적으로 처리하는 것이 부적절할 수도 있습니다.

 

코드를 보면 파일을 열기전에 파일 존재여부를 확인 하지 않고 try/except 구문을 사용하여 예외 처리를 하였습니다.

import os

os.path.exists('sketch.txt')

구문으로 먼저 파일의 존재를 확인 하고 작업을 할 수도 있지만 신경써야 하는 에러가 늘어날수록 '코드와 프로그램 논리를 추가'하는 해결책의 복잡도가 늘어나며, 나중에는 프로그램의 실제 목적 자체를 모호하게 할 정도가 될수 있습니다. 예외 처리 방식의 해결책은 이런 문제가 없습니다. 프로그램의 주목적이 명백히 나타나기 때문입니다.

코드가 해야 할 일에 집중하세요!

 

또한 파이썬에서는 final 구문이 있습니다. 만약 파일을 열어두고 작업시 에러가 발생하면 닫는 작업을 하기 위해서는 finally구문을 추가하고 그안에 닫는 작업을 하면됩니다.

하지만 파이썬에서는 'with'라는 키워드를 이용하여 파일을 닫지 않아도 파이썬 인터프리터가 자동으로 처리해줍니다.

with는 context management protocol이라는 파이썬 기술을 사용합니다. with open('sketch.txt') 라고 해주면 됩니다.

'Data Science > Python' 카테고리의 다른 글

[Python] 데이터처리  (0) 2015.03.10
[Python] 파일 데이터 저장하기  (0) 2015.02.27
[Python] 파일과 예외  (0) 2015.02.23
[Python] 모듈  (0) 2015.02.16
[Python] 함수  (0) 2015.02.16
[Python] 리스트  (0) 2015.02.16

댓글을 달아 주세요