파이썬 파일 다루기(File Handling)

모든 언어에서 파일을 다루는 것은 매우 중요한 일이고 필수적으로 알아두어야합니다. 프로그래밍에서 파일을 읽고 분석하는 작업, 그리고 결과를 기록하여 보관하는 작업 등 매우 필수적이기 때문이죠. 여러분이 어떤 실행파일을 설치했는데 그 설정된 이력을 어떻게 보관할 수 있을까요? 눈치 채셨겠지만 파일의 형태로 어딘가에 저장하고 읽고 수정합니다. 텍스트 파일로든 이진 파일로든 말이죠. 이제 파이썬에서 파일을 어떻게 다룰수 있는지 여러 예를 보면서 알아보도록 하겠습니다.

1. 파일 열기 - open

파일을 사용하기 위해선 가장 먼저 해야하는 일이 파일을 여는 것입니다. 파일을 열때 사용하는 함수가 open함수입니다. 이름이 너무 직관적이라서 기억하기도 쉽군요. open은 두가지 인자를 받을 수 있습니다. 하나는 파일 이름, 다른 하나는 file open mode입니다. mode는 아래에 표를 참고해주세요.

mode desc
"r" Read를 뜻하며 파일을 수정하는 용도가 아니라 읽기 전용으로 엽니다. 파일이 없으면 에러가 발생합니다.
"w" Write를 뜻하며 파일을 수정할때 사용하지만, 이미 파일에 내용이 있다면 새로 다시 씁니다. 파일이 존재하지 않으면 새로 생성합니다.
"a" Append를 뜻하고 파일에 내용을 덧붙일때 사용하는 mode입니다. "w" 모드는 새롭게 덮어쓰는 것이고, "a" 모드는 뒤에 추가한다는 점이 다릅니다. 역시 파일이 존재하지 않으면 새롭게 생성합니다.
"x" Create를 의미하며 파일을 생성합니다. 파일이 존재하면 에러를 반환합니다.

 

여기에 추가적으로 파일이 이진 파일이냐, 사람이 읽을 수 있는 텍스트 파일이냐에 따른 mode도 존재합니다.

mode desc
"t" Text를 뜻하며 텍스트 모드로 파일을 엽니다. open에서 mode를 지정하지 않으면 테스트 모드로 읽습니다.
"b" Binary를 뜻하며 이진 파일을 읽습니다. 예를 들면 이미지같은 파일을 의미하는 것이죠.

 

open은 호출이 완료되면 파일 객체를 반환해줍니다. 그리고 이 객체를 통해서 읽기, 쓰기 작업이 이루어질 수 있죠. 파일에 대한 작업을 완료하면 파일 객체의 close 메소드로 받드시 닫아주어야합니다.

※close() 를 반드시 해야하는 이유

보통 close()를 안하시고 중요하게 생각하지 않는 사람들이 많은데 그것은 우리들의 프로그램이 금방 끝나기 때문입니다. 아주 빈번하게 발생하는 문제점은 이런 상황입니다. 한글 파일을 연 상태에서 그 파일을 삭제시켜 보세요. 어디에서 열려있다고 하면서 삭제 동작을 하지 않습니다. 마찬가지로 프로그램 내에서 파일을 다 사용했는데 열어놓으면 다른 쓰레드나 프로세스가 쓸 수 없는 상황이 발생합니다. 이해하시겠죠? 아래 영화폴더는 저의 보물창고입니다.

 

아래의 코드는 exam.txt라는 파일을 읽기 전용으로 텍스트 모드로 열고 닫는 예를 보여줍니다.

f = open("exam.txt","rt")
f.close()

 

2. 파일 쓰기 - write, writelines

write를 통해서 파일에 내용을 쓸 수 있습니다. 이때 여러 줄을 쓸때는 List 자료형이나 Tuple을 사용할 수 있는 writelines 메소드도 존재합니다. 아래는 파일에 문자열을 쓰는 코드의 사용방법을 보여줍니다.

f = open("exam.txt","wt")
#일반적으로 쓰는 write
f.write("============write test===============\n")

# 리스트로 한번에 넣어버리기
lines = ["write\n","list\n","lines\n"]
f.writelines(lines)

# 튜플로 한번에 넣어버리기
lines = ("write\n","tuple\n","lines\n")
f.writelines(lines)

f.close()

 

위 코드를 작성하고 실행하면 프로젝트와 같은 디렉토리에 파일이 생겨납니다. 우리가 썼던 그 텍스트 내용인것을 확인할 수 있습니다.

write

 

3. read, readline

이제 이 파일을 읽어보도록 할까요? 읽기 위해서는 파일 객체의 read류의 메소드들을 사용하여 읽을 수 있습니다. read는 기본적으로 한글자씩 읽어오는 메소드입니다. 활용하는 방식은 아래와 같이 파일의 내용이 없을때까지 출력합니다. read()는 더 이상 읽을 내용이 없으면 빈 문자열을 반환합니다. 그리고 컴퓨터 공학에서는 이것을 파일의 끝(EOF: End Of File)이라고 합니다. C언어와 같은 언어에서는 EOF는 -1이라는 것은 그냥 참고만 하세요.

f=open("exam.txt","rt")
while True:
    c = f.read()
    if c == '':
        break
    print(c, end='')

f.close()
============write test===============
write
list
lines
write
tuple
lines

 

혹은 그냥 줄 단위로 가져오고 싶지는 않으신가요? 그럴땐 readline을 사용하여 가져올 수 있습니다. readline 역시 더 이상 읽을 데이터가 없다면 빈 문자열을 반환합니다.

f=open("exam.txt","rt")

while True:
    line = f.readline()
    if line == '' :
        break
    print(line, end='')

f.close()

 

writelines와 마찬가지로 리스트 형태로 여러 줄들을 읽어올 수도 있습니다. 그래서 for문으로 그 줄들을 순회할 수 있습니다.

f=open("exam.txt","rt")

lines = f.readlines()
for line in lines:
    print (line, end='')

f.close()

 

4. 파일 삭제 - remove

파일을 생성하고 쓰는 방법은 알았는데, 파일을 삭제하려면 어떤 방법으로 삭제를 할까요? os 모듈을 통해서 파일이 존재하는지 확인할 수 있고 삭제할 수 있습니다. 아래 코드는 해당 파일이 존재한다면 삭제하고, 아니라면 존재하지 않는 다는 출력을 해주지요. 

import os
if os.path.exists("exam.txt"):
  os.remove("exam.txt")
else:
  print("not exist")

 

해당 코드를 실행하면 우리가 지금까지 썼던 exam.txt 파일은 삭제되었음을 알 수 있습니다.

 

여기까지 파이썬으로 파일을 다루는 아주 기초적인 활용 예제들을 보았습니다. 파이썬이 다른 언어에 비해서 파일을 다루는 게 단순한 편입니다. 잘 숙지하시고 연습많이 하세요.

반응형
블로그 이미지

REAKWON

와나진짜

,