파이썬 파일 다루기(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()
위 코드를 작성하고 실행하면 프로젝트와 같은 디렉토리에 파일이 생겨납니다. 우리가 썼던 그 텍스트 내용인것을 확인할 수 있습니다.
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 파일은 삭제되었음을 알 수 있습니다.
여기까지 파이썬으로 파일을 다루는 아주 기초적인 활용 예제들을 보았습니다. 파이썬이 다른 언어에 비해서 파일을 다루는 게 단순한 편입니다. 잘 숙지하시고 연습많이 하세요.
'언어 > Python' 카테고리의 다른 글
[파이썬] 날짜(Date) 다루기 - datetime 객체와 날짜 연산, 날짜 format 출력 (2) | 2021.04.18 |
---|---|
[파이썬] 문자열 활용과 문자열 메소드 - join, split, replace, find 등 (0) | 2021.04.18 |
[파이썬] 리스트(List) 자료형과 다양한 활용 방법의 예제 (0) | 2021.04.17 |