파일 객체란?
파이썬에는 기본적으로 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!!!
'Python > 기초' 카테고리의 다른 글
[파이썬/Python] 함수의 정의와 활용에 대한 완벽 정리 (0) | 2023.07.08 |
---|---|
[파이썬/Python] List Comprehension: 효율적인 리스트 생성 (0) | 2023.07.07 |
[파이썬/Python] Iterable과 Iterator 객체를 만들어 보자. (0) | 2023.07.06 |
[파이썬/Python] Iterable과 Iterator에 대한 명쾌한 정리 (0) | 2023.07.06 |
[파이썬/Python] 얕은 복사(Shallow copy)와 깊은 복사(deep copy)에 대한 완벽 정리 (0) | 2023.07.05 |
댓글