- 파일 객체를 생성하는 방법
- 생성한 파일 객체를 읽는 방법
- 파일 객체 모드 설정문자
- 안전하게 파일 객체를 처리하는 with문
파이썬으로 파일을 읽거나 생성등을 하기위해 필요한 데이터
open() : 파일 객체 생성
close() : 파일 객체 닫기
'r' - 읽기용으로 파일을 엽니다. (기본값) 'w' - 쓰기용으로 엽니다. - 기존 파일을 대체하며 내용을 작성합니다. 'x' - 독점적인 파일 만들기용으로 엽니다. - 이미 존재하는 경우에는 실패합니다. 'a' - 쓰기용으로 엽니다. 기존 파일의 내용을 추가합니다. 'b' - 바이너리 모드 - 바이너리 모드란? - 데이터가 이진형태로 표현되거나 처리되는 모드 't' - 텍스트 모드(기본값) '+' - 갱신(읽기 및 쓰기)용으로 엽니다.
이러한 객체 모드 문자들들 조합하여 사용하게 되는데.
rt, r, 적지않음 - 텍스트모드 + 읽기 전용으로 파일을 엽니다. - 파일이 없으면 에러 발생 wt, w - 텍스트모드 + 쓰기전용으로 파일을 엽니다. - 파일이 없으면 생성하며, 추가되는 내용은 기존 내용을 대체합니다. at, a - 텍스트모드 + 추가전용으로 파일을 엽니다. - 파일이 없으면 생성하며, 추가되는 내용은 기존 내용에 덧붙입니다. rt+, r+ - 텍스트모드 + 읽기모드 + 쓰기모드, 파일이 없으면 `에러` wt+, w+ - 텍스트모드 + 읽기모드 + 쓰기모드, 파일이 없으면 `생성`
안전하게 파일 객체를 닫는 with문
text = """icbanq여러분, 안녕하세요. 스펜서입니다.
파이썬 입문을 하고 있어요.
벌써 8번째 수업이네요.
"""
#파일 객체 - open() => 파일생성 => 파이썬이 실행되는 위치
# close()를 하지않아도 with문이 종료되면서 자동으로 close()해줍니다.
with open('./01.txt', 'a') as fp:
fp.write(text)
# import time
# while True:
# time.sleep(1)
이렇게 코드를 입력후 실행시켜보면
01.txt가 생성된 것을 볼 수 있습니다.
그러나 막상 파일을 들어가보면 오류가 뜨는것을 볼 수 있는데
메모장에서는 제대로 출력되는 것을 볼 수 있습니다.
리눅스나 Mac이 아닌 윈도우에서 생기는 문제라고 하는데.
VS코드에 설정으로 들어갑니다.
Auto Guess Encoding부분을 체크해줍니다.
이제 제대로 출력되는 것을 확인할 수 있습니다.
text = """icbanq여러분, 안녕하세요. 스펜서입니다.
파이썬 입문을 하고 있어요.
벌써 8번째 수업이네요.
"""
#파일 객체 - open() => 파일생성 => 파이썬이 실행되는 위치
fp = open('c:/hansol/alldata/python/PythonStudy/PYTHON-BEGINNEL/Day08/01.txt', 'w')
fp.write(text)
fp.close() # 쓰면 꼭 닫아야 합니다.
# 상대 경로로 파일 생성하기
fp = open('./01.txt', 'w')
# 이렇게하면 파일이 생성될 것 같지만
# WD(Warking Directory - 작업공간)가 고정되어 있지않기때문에
# 원하는곳에 파일이 생성되지 않습니다.
# 따라서 다음과 같이 해보세요
#현재 WD확인
import os
print("현재WD : ", os.getcwd())
# WD 변경
import os
print(__file__)
# 현재 파일명을 포함한 파일경로를 출력해줌
print(os.path.dirname(__file__))
# 현재 파일을 제외한 파일경로(해당 파일이 있는 폴더까지)
# 요약
import os
os.chdir(os.path.dirname(__file__))
# os.chdir("원하는폴더경로") = os.chdir = WD변경
# 따라서, 현재 경로로 WD를 옮겨서 파일을 생성하려면
# 0. import os
# 1. os.chdir(os.path.dirname(__file__))을 한뒤
# 2. 상대경로로 파일을 생성
fp = open('./01.txt', 'w')
fp.write(text)
fp.close() # 쓰면 꼭 닫아야 합니다.
text = """icbanq여러분, 안녕하세요. 스펜서입니다.
파이썬 입문을 하고 있어요.
벌써 8번째 수업이네요.
"""
#파일 객체 - open() => 파일생성 => 파이썬이 실행되는 위치
# 파일 생성 - WD의 위치에 따라 어디에 생성될지 모름
fp = open('./01.txt', 'w')
fp.write(text)
# fp.close()
import time
while True:
time.sleep(1)
# close 테스트
# fp.close()를 입력하지않고 실행해보세요.
# while문이 무한반복되어 터미널을 종료하기전에는
# 저장이 되지 않는 것을 볼 수 있습니다.
※ with문을 사용할때는 close()를 하지않아도 with문 종료시 자동으로 close()해줍니다.
read(), readline(), readlines()
04.txt파일
# 파일 읽기
# WD를 상대경로로 변경
import os
os.chdir(os.path.dirname(__file__))
fp1 = open("./04.txt", 'r', encoding='utf-8')
# read(), readline(), readlines()
print(fp1.read())
fp1.seek(0) # 커서 위치 조정,
print(fp1.tell(), "커서 위치 확인") # 커서 위치 확인
print(fp1.read())
fp1.close()
# readline - 한 줄씩 가져옵니다.
print("="*40)
with open("./04.txt", "r", encoding="utf-8") as fp2:
# repr(\n 확인) / '{!r}'.format() => repr과 같음
print(repr(fp2.readline()))
print('{!r}'.format(fp2.readline()))
print(fp2.readline())
# readlines - 여러줄을 가져옵니다
# 현재 커서 위치부터 끝까지 여러줄을 가져옵니다.
# 리스트 반환, 새행(엔터 기준)으로 나눠서 가져옵니다.
print("="*40)
with open("./04.txt", "r", encoding="utf-8") as fp3:
print(fp3.readlines())
fp3.seek(0)
print(repr(fp3.readlines()))
이때 주의해야할 사항은 seek()로 커서 위치를 조정할때
영어 알파뱃은 1씩 이동되지만 한글은 3씩 이동해야 오류가 나오지 않습니다.