파일 객체 (1)

송한솔·2023년 5월 25일
0

파이썬

목록 보기
10/16

목표

  1. 파일 객체를 생성하는 방법
  2. 생성한 파일 객체를 읽는 방법
  3. 파일 객체 모드 설정문자
  4. 안전하게 파일 객체를 처리하는 with문

파일 객체

파이썬으로 파일을 읽거나 생성등을 하기위해 필요한 데이터

open() : 파일 객체 생성
close() : 파일 객체 닫기

  • 기본적으로 하나의 파일에는 하나의 파일 객체만 접근 가능
  • 다른 객체가 이용중이라면 접근이 불가능하거나, 제한된 사용

파일 객체 모드 문자

'r'
- 읽기용으로 파일을 엽니다. (기본값)

'w'
- 쓰기용으로 엽니다.
- 기존 파일을 대체하며 내용을 작성합니다.

'x'
- 독점적인 파일 만들기용으로 엽니다.
- 이미 존재하는 경우에는 실패합니다.

'a'
- 쓰기용으로 엽니다. 기존 파일의 내용을 추가합니다.

'b'
- 바이너리 모드
- 바이너리 모드란?
- 데이터가 이진형태로 표현되거나 처리되는 모드

't'
- 텍스트 모드(기본값)

'+'
- 갱신(읽기 및 쓰기)용으로 엽니다.

이러한 객체 모드 문자들들 조합하여 사용하게 되는데.

rt, r, 적지않음
- 텍스트모드 + 읽기 전용으로 파일을 엽니다.
- 파일이 없으면 에러 발생

wt, w
- 텍스트모드 + 쓰기전용으로 파일을 엽니다.
- 파일이 없으면 생성하며, 추가되는 내용은 기존 내용을 대체합니다.

at, a
- 텍스트모드 + 추가전용으로 파일을 엽니다.
- 파일이 없으면 생성하며, 추가되는 내용은 기존 내용에 덧붙입니다.

rt+, r+
- 텍스트모드 + 읽기모드 + 쓰기모드, 파일이 없으면 `에러`

wt+, w+
- 텍스트모드 + 읽기모드 + 쓰기모드, 파일이 없으면 `생성`

with문

안전하게 파일 객체를 닫는 with문

  • open()을 하면 반드시 close()를 해야합니다.
  • 그 사이에 문제가 생기거나, close()를 잊게되면 해당 파일은 접근할 수 없는 상태가 됩니다.
  • with문에서 생성한 파일 객체는 자동으로 close()됩니다.
    필요 작업이 끝나거나, 이상이 생겼을 때도 작동합니다.
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() # 쓰면 꼭 닫아야 합니다.

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씩 이동해야 오류가 나오지 않습니다.

0개의 댓글