본문으로 바로가기

Python: 파일로부터 데이터 읽기

category Programming/Python 2021. 2. 5. 20:19
반응형

모듈에 관한 내용을 끝으로, 파이썬의 기본적인 내용에 대한 시리즈는 완료하였다. 그렇다고 해서, 파이썬에 관한 공부가 끝났다고 할 수는 없다. 2021년 1월 기준으로 가장 인기 있는 프로그래밍 언어 3위에 파이썬이 랭크된 만큼, 파이썬으로 다양한 분야에 활용할 수 있는 프로그램의 작성이 가능하고, 그러기 위해서는 파이썬의 응용법에 대해서도 알아볼 필요가 있다. 하지만, 파이썬의 응용과 관련해서 또 다시 시리즈로 작성할 계획은 아니고, 간간히 하나의 주제를 잡아 그 부분에 관한 글을 포스팅할 예정이다.

각설하고, 오늘 다룰 내용은 파일의 입출력에 관한 내용이다. 프로그래밍에서 파일의 내용을 읽고, 실행 결과를 파일에 써주는 작업은 여러 방면으로 활용되는 부분이다. 프로그램의 실행과 관련된 여러 설정 데이터를 파일로 저장하고, 프로그램에서 가져와 사용하는 경우도 여기에 해당하고, 프로그램이 실행되는 동안 발생되는 여러 이벤트들을 로그로 남기는 작업 또한 여기에 해당한다. 이러한 데이터들은 다양한 포맷의 파일로 저장되기도 하고, 포맷에 따라 읽어들이는 부분도 많이 달라지지만, 오늘은 이러한 파일 입출력의 기본이라 할 수 있는 텍스트 파일의 입출력을 이야기 해보려고 한다.

파일 열기 & 닫기

파이썬에서 파일의 내용을 읽거나 파일에 새로운 내용을 쓰는 작업은 모두 파일 객체를 통해 이루어진다.

그리고 파일 객체는 위 그림과 같이 open 함수를 통해 정의된다. open 함수는 이름에서 알 수 있듯이, 파일을 열어주는 역할의 함수이므로, 매개변수로 열어줄 파일의 이름속성을 전달해주어야 한다.

파일의 이름은 경로를 포함한 문자열로 정의할 수 있고, 파일을 열어줄 때의 속성은 위 그림과 같이 하나의 읽기 속성3개의 쓰기 속성으로 구분된다. 여기서 눈여겨 볼 부분은 r과 x 속성에서는 파일의 유무에 따라 에러가 발생한다는 점이다. 다시 말해, 파일의 내용을 읽어들이기 위해 r 속성으로 open 함수를 호출할 경우, 대상 파일이 있는 경우에는 정상적으로 다음 라인의 파이썬 코드가 실행되지만, 파일이 없는 경우에는 에러 발생으로 인해 프로그램의 실행이 종료된다는 의미이다.

이런 경우를 방지하기 위해, 파이썬 기본편에서 살펴본 Try & Except를 사용해서 에러에 의한 프로그램의 종료를 막아줄 수 있다.

open 함수를 이용해서 파일을 열어주었다면, close 메소드를 이용해서 반드시 파일을 정상적으로 닫아주어야 한다.

파일 읽기

파일을 열었다면, 파일을 구성하는 데이터를 한번 읽어보자.

sample.txt 파일이 위 그림과 같은 데이터를 가지고 있다고 가정하자.

파일의 내용을 읽을 때는 read 메소드를 사용한다. 그리고, read 메소드는 파일 내부의 전체 데이터를 읽어서 문자열로 반환한다.

만약, 파일의 일부만 읽으려면 위 그림처럼 read 메소드를 호출할 때 읽어들일 데이터의 양을 인자로 전달해주어야 한다. 그리고, 이 때 전달되는 인자는 바이트의 크기를 의미한다. read 메소드를 이용해서 파일의 일부만 읽어들여도 시스템은 마지막으로 읽어들인 위치를 자동으로 기억한다. 그래서, 3번 라인의 read 메소드는 이전 read 메소드가 읽어들인 위치로부터 다음의 4바이트를 읽어서 data02에 반환하는 것이다.

이전 read 메소드가 읽어들인 위치를 자동으로 기억한다는 것은 상당히 유용하게 활용될 수 있다. 파일에서 필요한 부분만 따로따로 읽어서 저장할 수 있기 때문이다. 하지만, 위 예제의 data02에 저장된 문자열처럼 원하지 않는 공백 문자가 추가되는 문제도 나타날 수 있다. strip 함수를 이용해서 저장된 문자열에서 공백 문자를 제거할 수도 있지만, 파일을 읽어들이는 위치를 임의로 조정해서 공백문자를 피해 데이터를 읽어들이는 방법도 있다.

파일을 읽어들일 위치를 지정할 때, 위 그림과 같이 seek 메소드를 사용한다. seek 메소드는 파일이 시작되는 위치로부터 인자로 전달된 숫자만큼 일종의 커서를 이동시키는 역할을 해준다. 그런데, 여기서 짚고 넘어가야할 부분은 seek 메소드를 호출할 때 사용하는 인자들이다.

파일객체.seek(바이트 크기, 속성)

seek 메소드는 위의 내용처럼, 커서를 이동시킬 바이트 크기에 추가로 속성을 인자로 전달할 수 있다. 여기서 속성은 커서를 이동시킬 위치의 기준으로 파일의 시작 위치를 기준으로 할 때는 0, 현재 위치를 기준으로 할 때는 1, 파일의 끝을 기준으로 할 때는 2를 사용한다. 하지만, 파이썬3에서 텍스트 타입으로 파일을 열었을 때에는 0이 아닌 다른 값을 사용할 수 없다. (바이너리 타입에서는 사용할 수 있다.) 그런 이유로, 위 예제 프로그램에서는 커서의 현재 위치를 반환하는 용도의 tell 메소드를 이용해서 위치를 지정하였다. 이런 방식으로 원하는 위치의 데이터만 골라서 읽을 수 있지만, 포맷이 일정하더라도 데이터의 길이가 들쭉날쭉할 경우 사용하기 어렵다는 단점을 함께 가지고 있다.

read 메소드가 파일 안의 데이터를 하나의 문자열로 반환했다면, readlines 메소드는 라인 단위로 구분된 리스트를 반환한다. 위 그림을 통해 알 수 있듯이, 파일 속의 데이터가 어떻게 구성되었는지를 한 눈에 확인할 수 있으므로, read와 seek 메소드를 이용해 데이터를 요소마다 읽는 것 보다 라인 전체를 읽어서 split 함수 등을 이용해 원하는 데이터를 추출해 낼 수 있다.

readlines 메소드로 파일의 내용 전체를 읽어들여서 원하는 내용을 추출하는 방법도 있지만, readline 메소드를 이용해서 한 줄씩 데이터를 읽어들이는 방법도 있다. 위 그림은 while 루프와 readline 메소드를 이용해서 파일의 내용을 한 줄씩 반복해서 읽어들이는 부분을 보여주고 있는데, readlines 메소드도 반복문에 적용할 수 있는 리스트로 반환되므로, 어떤 방식이든지 편한 방법을 활용하면 된다.

파일의 입출력에 관한 내용을 모두 포스팅할 계획이었으나, 쓰다보니 글이 길어져서 파일의 출력에 관한 내용은 다음 글을 통해 알아보겠다.

 

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: Module  (0) 2021.01.28
Python: Class04  (0) 2021.01.27
Python: Class03  (0) 2021.01.26
Python: Class02  (0) 2021.01.25
Python: Class01  (0) 2021.01.24