본문 바로가기
Python/기초

[파이썬/Python] 파일 쓰고 읽기: 파일 객체에 대한 총정리

by 모두의 케빈 2023. 7. 7.

파일 객체란?


 

파이썬에는 기본적으로 open이라는 함수가 내장되어 있습니다. 파일 객체는 open 함수에 의해 반환되는 객체로, 파이썬 환경에서 텍스트 파일을 읽고 쓸 수 있도록 지원해 주는 객체입니다.

여러 인자가 있지만 가장 중요한 두 개의 인자는 텍스트 파일을 처리하는 경로와 mode입니다. 파일 객체는 mode에 따라 성격이 바뀌기 때문에 mode 인자를 올바르게 알아야 합니다. 우선 mode 인자에 대해 살펴보겠습니다.

 

 - 'r' : read의 줄임말로, 경로의 파일을 호출하여 읽는 것만 가능합니다. 경로에 파일이 없다면 에러가 발생합니다.

- ' w': write의 줄임말로, 파일에 내용을 쓸 수 있는 모드입니다. 경로에 파일이 없다면, 새로운 파일을 만듭니다. 경로에 파일이 있다면, 자동으로 덮어쓰기 되니 이 점 주의하셔야 합니다. 내용을 중간부터 작성할 수 없습니다.

- 'a': 쓰기 모드입니다. 'w'와 달리, 경로에 기존 파일이 있다면 기존 파일의 내용을 유지한 채 이어서 작성할 수 있습니다.

- 'x': 경로에 파일이 없으면 'w' 모드로 적용됩니다. 경로에 파일이 있다면, 에러를 발생시킵니다.

- 'b': 바이너리 모드입니다.

- 't': 텍스트 모드로 기본값(Default)입니다.

 

자 그러면, 현재 파이썬이 실행되고 있는 경로에 새로운 텍스트 파일을 만들어보겠습니다. write 모드로 파일 객체를 호출해 보겠습니다. os.getcwd()는 파이썬이 실행되고 있는 현재 경로를 반환해 줍니다. 

 

import os 

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'w')
print(type(f)) # <class '_io.TextIOWrapper'>
f.close() # 볼일이 끝났으면 항상 닫아주는 습관

 

"iO.TextIOWrapper'라는 파일 객체가 생성된 것을 볼 수 있습니다. 참고로 파일로 해야 하는 Task가 모두 종료되면 close 하는 습관을 들이시는 게 좋습니다. 파일 객체를 open 한 상태에서 닫지 않으면, 파일 안의 내용이 지워질 가능성이 있습니다.

 

파일 쓰기: Write 모드에 대해 실습해 보자.


 

파일 객체를 생성한 다음, 파일 객체에 접근하여 내용을 작성해 보겠습니다. 내용을 작성하려면 파일 내부의 write 메서드를 활용하면 됩니다. 참고로, 줄 바꿈이나 띄어쓰기를 하시려면 '\n', '\t'를 직접 텍스트로 입력해주셔야 합니다.

import os 

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'w')

f.write('First Class of Python File I/O\n')
f.write('Please Enjoy my POST!!!')

f.close()

 

코드 실행 결과

 

 

문자열 말고, 리스트(List)의 값을 파일에 쓸 수 있습니다. writelines 메서드를 활용합니다.

import os 

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'w')

f.writelines(['Oh','My','God','You','my','ideal','type'])
f.write('\n')
f.writelines(' '.join(['Oh','My','God','You','my','ideal','type']))

f.close()

 

코드 실행 결과

 

재미있는 것은, 이전에 test 파일에 작성해 두었던 내용이 모두 사라졌다는 점입니다. 'w' 모드는 항상 첫 줄부터 파일을 작성하기 때문에 이전의 내용을 유지할 수 없습니다.

이전의 내용을 유지하기 위해서는 'a' 모드로 접근하셔야 합니다.

import os 

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'a') # 이전 작성 내용 유지

f.write('\n\n\n')
f.write('Then, Who is your ideal type?\n')
f.write('Answer me!!!')

f.close()

 

코드 실행 결과

 

파일 읽기: Read 모드에 대해 실습해 보자.


 

이번엔 위에서 작성한 파일을 읽어보겠습니다. 'r' 모드로 파일 객체를 호출하면 됩니다. 이 경우, 파일의 내용은 수정할 수 없습니다.

먼저 읽기에서 가장 기본이 되는 건 'read' 메서드입니다. 'read' 메서드는 괄호 안에 숫자를 인자로 주면, 그 숫자만큼의 개수를 반환합니다. 괄호 안에 아무 숫자도 없다면, 파일의 텍스트 전체를 읽습니다.

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'r') 
read_result = f.read()
f.close()

print(read_result)


# 위 코드의 결과값
OhMyGodYoumyidealtype
Oh My God You my ideal type


Then, Who is your ideal type?
Answer me!!!

 

'readline' 메서드는 파일에 개행문자인 '\n'을 기준으로 line을 읽어옵니다. 한 줄씩 읽어오기 때문에 보통 for문과 함께 사용됩니다.

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'r') 
readline_result = f.readline()
f.close()

print(readline_result)

# 위 코드의 결과값
OhMyGodYoumyidealtype

 

'readlines' 메서드는 파일의 모든 문장을 읽어오지만, 결괏값은 개행문자가 포함된 list로 반환됩니다.

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'r') 
readlines_result = f.readlines()
f.close()

print(readlines_result)

# 위 코드의 결과값
['OhMyGodYoumyidealtype\n', 
 'Oh My God You my ideal type\n', '\n', '\n', 
 'Then, Who is your ideal type?\n', 'Answer me!!!']

 

seek, tell 그리고 with


 

워드나 텍스트 파일에 글을 작성하실 때, 깜빡깜빡하시는 것을 볼 수 있습니다. 그곳부터 글이 작성된다는 뜻인데요. 이를 '커서'라고 합니다. 'seek'와 'tell' 메서드는 이 커서를 조절하는 함수입니다.

tell 메서드는 현재 커서의 위치를 반환합니다. seek 메서드는 입력한 숫자에 해당하는 위치로커서를 이동시킵니다.

 

file_path = os.getcwd() + '\\' + 'test.txt'

f = open(file_path, 'r') 

print("시작 위치:: ", f.tell())
f.seek(10)
print("커서 이동: ", f.tell())

readlines_result_1 = f.readline()

f.seek(60)
print("커서 이동: ",f.tell())

readlines_result_2 = f.readline()

f.close()

print(readlines_result_1, readlines_result_2)


# 위 코드의 결과값
시작 위치::  0
커서 이동:  10
커서 이동:  60
myidealtype
 , Who is your ideal type?

 

 

'with' 문은 파일을 open 하고 모든 행동이 끝나는 순간, 자동으로 close 해주는 구문입니다. 훨씬 깔끔하게 파일을 다룰 수 있습니다.

file_path = os.getcwd() + '\\' + 'test.txt'


with open(file_path, 'r') as f:
    read_all_text = f.read()

print(read_all_text)

# 위 코드의 결과값
OhMyGodYoumyidealtype
Oh My God You my ideal type


Then, Who is your ideal type?
Answer me!!!

댓글