본문 바로가기
Python/Python Basic

20. Python - 파일 읽기, 쓰기 및 추가

by Rosmary 2020. 5. 17.
728x90
반응형

대부분의 프로그램은 프로그램 구동에 필요한 파일을 가지고 있다. 예를 들어, 게임 프로그램의 경우 특정 시점에 저장된 파일을 불러들이는 기능이 있는데, 프로그램에서 저장 당시 게임의 내용을 고스란히 기억할 수 있는 파일이 존재해야 한다. 해당 시점에 게임을 저장하기 위해서는 저장 당시의 게임 내용을 저장할 파일에 쓸 수 있어야 하며, 이 게임을 불러들이기 위해서는 저장된 파일을 읽어들일 수 있어야 한다.

 

대부분의 프로그래밍 언어는 이러한 파일의 읽기 및 쓰기 기능을 제공한다. 그리고 Python은 여타 프로그램에 비해 매우 간편한 방식으로 파일을 읽고 쓰고 내용을 추가하는 것이 가능하다. 하나씩 살펴보자. 

 

 

1. 파일의 읽기, 쓰기, 내용 추가 절차

 

파일을 읽거나 쓰거나, 내용 추가를 하기 전에, Python에게 파일과 관련된 작업을 진행할 것이라고 알려주는 과정이 선행되어야 한다. 그리고, 해당 파일에 쓰기 또는 읽기 등의 작업이 끝나면, Python에게 파일과 관련된 작업이 모두 끝났음을 알려주어야 한다. 이와 관련된 코드를 정리하면 아래와 같이 나타낼 수 있다.

 

--------------------------------------------------------------------------

변수1 = open("파일명.파일확장자", "읽기(r), 쓰기(w), 내용 추가(a)")   # Python에 파일관련 작업을 진행할 것임을 알림

변수1. 작업내용                                                                     # 파일 읽기 / 쓰기 진행

변수1.close()                                                                        # Python에 파일 관련 작업 종료를 알림

---------------------------------------------------------------------------

 

마치 사람이 워드 작업을 하는 것과 비슷하다. 우선 워드 작업을 위해 word 프로그램을 실행하는 것이 첫 번째 줄과 동일하다고 보면 된다. 그리고 두 번째 줄은 사람이 실제 워드에 글을 쓰거나 읽는 작업을 진행하는 것이라 보면 되고, 마지막 줄은 사용자가 word 프로그램을 저장하고 닫는 행위와 동일하다고 보면 된다. 이제 Python으로 메모장 텍스트 파일을 읽고 쓰는 작업을 진행해보자.

 

 

1. 파일의 읽기

 

먼저 메모장을 열고 자신만이 알아볼 수 있는 문장을 작성하자. 필자는 그 유명한 "Hello World!"를 변경한 "Hello, Python!!!"으로 바탕화면에 저장하려고 한다. 파일명은 test.txt로.

 

 

이제 Python을 통해 해당 파일의 내용을 읽어들이려 한다. 먼저 Python에게 파일과 관련된 작업을 할 것이며 해당 파일을 파일 객체로 저장할 것임을 알려준다.

 

*** 참고!! 작업 전에 CMD 창에서 파일이 저장된 위치로 이동한 뒤, python 명령어를 실행해야한다. dir 명령어로 test.txt가 결과물에 출력되는지 확인하고 python 명령어를 입력하자.

 

 

----------------------------------------------------------------------------------------------------------------------------

file = open("test.txt", "r")           # file 이라는 변수명에 test.txt파일을 읽어들이는 작업을 진행할 것이라고 선언

----------------------------------------------------------------------------------------------------------------------------

 

해당 코드를 실행함으로써, Python은 file이라는 변수명에 test.txt 파일 객체에 대한 내용을 저장하게 된다.

 

다음은 해당 파일을 읽어들이는 작업을 코드로 작성할 차례다. 텍스트 파일을 읽어들이는 방법은 크게 두 가지가 있다. 전체 내용을 한 줄 씩 읽어들이는 방법과, 전체 내용을 줄 단위로 나누어 list 형태로 읽어들이는 방법이 있다. 

 

(1) 한 줄 씩 읽기

 

한 줄 씩 읽는 방법은 다음과 같이, 파일 객체 변수명 뒤에 readline()함수를 넣어주면 된다. 

 

file 객체 뒤의 readline() 함수는 파일로부터 읽어들인 값을 한 줄 씩 반환하기 때문에, 변수 contents_one_line에 file.readline() 값을 지정하면, print() 함수를 통해 한 줄 씩 내용을 출력하는 것이 가능해진다.

 

파일의 마지막 줄을 지나면 file.readline()으로 불러들인 내용은 "\n"으로 끝나며, 이 줄 뒤에서 readline()함수를 다시 실행하게 되면, 마지막 줄의 내용인 "\n"만 반복적으로 출력된다. 다시 처음부터 한 줄 씩 출력하고 싶다면, 파일 객체를 닫은 뒤, 다시 파일 객체를 만들어 읽기 작업을 수행할 것이라고 Python에 알려주어야 한다. 파일 객체를 닫는 방법은 파일 객체 변수명 뒤에 close()함수를 넣어주면 된다.

 

 

(2) 전체 내용을 줄 단위로 리스트 저장하는 방법

 

사실 readline() 함수는 파일 내용을 한 줄 씩 읽어 반환하기 때문에 실제 프로그래밍을 진행함에 있어서 성가신 면이 한 두 가지가 아니다. 따라서 Python에서는 전체 내용을 줄 단위로 잘라, 리스트 형태로 저장해주는 기능을 제공한다.

 

전체 내용을 줄 단위의 리스트로 저장하기 위해 사용하는 함수는 readlines() 다. 

 

현재는 Hello Python!!! 한 줄만 파일에 작성되어 있기 때문에 list의 내용이 단 한 개만 출력되지만, 아래와 같이 test.txt 파일을 여러 줄로 수정한 뒤 저장하고 동일한 작업을 반복하면, 아래와 같이 여러 내용이 list에 추가됨을 알 수 있다.

 

위와 같은 결과가 나타났다면 file.close() 함수로 파일 작업을 끝내겠다는 내용을 Python에 알려주자.

 

 

 

2. 파일의 쓰기

 

파일의 쓰기 또한 읽기와 크게 다른 점은 없다. 다른 점이 있다면 Python에게 작업 내용을 알려줄 때, "r"(읽기)이 아닌 "w"(쓰기)로 알려주어야 한다는 점과 작업 시, readline()과 readlines() 함수가 아닌 write()함수를 쓴다는 점이다.

 

이제, 기존의 test.txt 파일을 지우고, 파일 쓰기 코드로 지운 test.txt 파일의 내용을 다시 한 번 만들어보려 한다.

 

** 참고로 위의 작업 시, file.close() 코드를 누락하면, 파일을 아무리 지우려고 해도 지워지지 않는다. 왜냐하면 Python이 아직 작업이 끝나지 않았다고 판단하고 파일을 여전히 붙잡고 있는 상황이기 때문이다.

 

먼저 파일 쓰기 작업을 시작한다는 것을 Python에 알려준다.

 

파일명 test.txt에 쓰기 작업 진행을 선언하는 코드

파일에 대해 쓰기 작업을 진행할 것이기 때문에, "r"이 아닌 "w"가 인자로 들어가 있다. test.txt 파일을 열었기 때문에 이제 파일 내에 내용을 작성해주어야 한다. 파일의 작성과 관련된 함수는 write("파일 내용")이다.

 

열러있는 파일에 내용을 쓰는 작업은 print() 함수와 달리 자동 개행이 진행되지 않기 때문에 줄 단위로 작성하기 위해서는 내용의 마지막에 반드시 "\n"을 추가해 주어야한다. 작성이 마무리되면 file.close()로 작업이 마무리되었음을 Python에 알려준다.

 

 

이제 해당 파일이 잘 저장되어 있는지 확인해보자. 필자는 바탕화면에 저장해 두었으며 해당 파일을 열면, 필자가 의도한 대로 내용이 잘 들어가 있음을 확인할 수 있다.

 

 

 

3. 파일에 내용 추가

 

마지막으로 파일에 내용을 추가하는 방법에 대해 알아보겠다. 아마 프로그래밍을 통해 파일 쓰기를 처음 접해보신 분들이라면, 이 내용 추가가 왜 따로 존재하고 있는지 의문이 가실것이다. 궁금하시다면, 이전 작업에서 만들어놓은 test.txt 파일에 쓰기 작업을 다시 진행해보도록 하자. 이 경우, 이전의 작업 내용이 날아가고 새로 넣은 내용만 파일에 존재함을 확인할 수 있다.

 

 

이러한 이유로, 프로그래밍으로 파일 내용을 추가할 때는 "w"(쓰기)가 아니라 "a"(추가, append)를 사용하여 파일을 열어주는 선언을 하게 된다. 이제, test.txt 파일에 "\nHello World!!!\nPython is really good!!!\nHave a nice Day!!!"를 추가해보려 한다. 

 

파일에 내용 추가를 한다는 내용을 Python에 알려준다. "r"과 "w" 대신 "a"를 인자로 넣어준다. 파일에 내용 추가를 위해 사용하는 함수도 따로 존재할 것 같지만 의외로 내용 추가 역시 write()함수를 통해 진행해주면 된다. 아래와 같이 모든 내용의 추가가 끝나면 file.close()를 선언하여 작업이 끝났음을 알려주자.

 

 

파일의 내용을 열어 확인해보면, 추가한 내용이 잘 들어가 있음을 확인할 수 있다.

 

 


지금까지 Python을 이용한 파일의 읽기, 쓰기 및 내용 추가에 대해 알아보았다. 만약 프로그래밍을 만들면서 파일 작업이 빈번한 과정이 존재한다면 다음과 같이 파일 작업 내용에 따라 함수를 만들어 사용하는 것이 조금 더 편하긴 하다.

 

< 파일 읽기 함수>

def file_read(filename):

 

   file.open(filename, "r")

   for line in file.readlines():

 

        print("{}".format(line))

 

    file.close()

 

<파일 쓰기 함수>

def file_write(filename, write_contents):

    

   file.open(filename, "w")

   file.write(write_contents)

   file.close()

 

<파일 내용 추가 함수>

def file_write(filename, write_contents):

    

   file.open(filename, "a")

   file.write(write_contents)

   file.close()

 

 

다음 포스팅에서는 Python 기초 포스팅의 마지막 내용인 예외 처리에 대해 알아보려고 한다.

반응형

댓글