Python:File

aiden·2023년 6월 21일
0

Python

목록 보기
13/14

File

파일은 장치의 전원이 꺼져도 유지될 수 있도록 저장하는 역할을 한다.
파일은 바이트들로 이루어져 있고 파일의 끝에 EOF이 존재한다. 파일 내 입출력을 위해 위치 표시자가 존재한다. 처음 파일을 열었을 때 위치 표시자는 파일의 첫 바이트를 가리키며 읽거나 쓰는 경우 위치 표시자가 갱신된다.

File Type

파일에는 두 가지 종류가 있다. 텍스트 파일(text file)과 이진 파일(binary file)이다. 텍스트 파일은 문자로 이루어져 있으며 문자는 아스키 코드를 따른다. 이진 파일은 바이너리 데이터로 이루어진 파일이다. 이미지 파일, 한글 파일, 실행 파일 등이 이에 속한다.

Text File

Read&Write

파일에 데이터를 읽고 쓰기 위해 파일을 열어야 한다. open() 함수는 파일 이름을 받아 객체를 생성한 후 반환한다. 작업 완료 후 close() 함수를 통해 파일을 닫는다.
다음과 같은 구조를 갖는다.

open() 함수가 파일을 여는 데 실패하면 None 객체를 반환한다.

파일 모드는 다음과 같다.

  • "r" : 읽기 모드. 파일을 처음부터 읽는다.
  • "w" : 쓰기 모드. 파일을 처음부터 작성한다. 파일이 이미 존재하는 경우 기존 내용을 삭제하고 다시 쓰고, 파일이 없는 경우 새로 생성된다.
  • "a" : 추가 모드. 파일의 끝에 쓴다. 파일이 없는 경우 생성된다.
  • "r+" : 읽기와 쓰기 모드. 파일에 읽고 쓰기가 가능하다.

파일 열기

현재 디렉토리의 파일을 여는 경우 다음과 같이 작성한다.

infile = open("filename.txt", "r")

절대 경로를 사용하는 경우 다음과 같이 작성한다. 이 때, r을 붙이는 이유는 이스케이프 시퀀스로 해석되는 것을 방지하기 위함이다.

infile = open(r"c:\doc\filename.txt", "r")

아래는 동일한 표현이다.

infile = open("c:\\doc\\filename.txt", "r")

데이터 읽기

read() 함수는 파일 객체에서 하나의 문자를 읽는다. 여러 개의 문자를 읽고 싶은 경우 인자로 읽을 문자의 개수를 전달한다.
readline() 함수는 파일에서 줄 하나를 읽는다.

파일 내의 모든 문장을 읽는 경우 다음과 같은 코드를 사용할 수 있다.

infile = open("filename.txt", "r")
line = infile.readline()
while line != "":
	print(line);
	line = infile.readline()
infile.close()

또는

infile = open("filename.txt", "r")
for line in infile:
	line = line.rstrip()
	print(line)
infile.close() 

rstrip() 함수는 문자열의 오른쪽 공백 문자를 제거하는 메서드이다.

데이터 쓰기

파일에 데이터를 쓸 때에는 write() 함수를 사용한다.

outfile = open("new.txt", "w")

outfile.write("This is first sentence\n")
outfile.write("This is second sentence\n")
outfile.write("This is third sentence\n")

outfile.close()

파일이 이미 존재하는지를 확인하려면 os.path의 isfile()함수를 사용한다. 이 함수는 파일이 존재하는 경우 True를 반환한다.

텍스트 입출력+

데이터 추가

데이터를 추가하는 경우 파일의 모드를 "a"로 두고 write() 함수를 사용한다.

줄바꿈 기호 삭제

rstrip() 함수를 이용한다.

단어 읽기

문자 읽기와 문장 읽기 함수는 각각 read()와 readline()이었다. 단어를 읽으려면 문자열 객체의 split() 메서드를 이용한다. split()은 공백문자를 이용해 문자열에서 단어를 분리해 리스트의 형태로 반환한다. 다른 분리자를 설정하고 싶은 경우 인수로 전달할 수 있다.

✔예제

텍스트 파일을 열어 각 줄의 앞에 번호를 매겨서 다시
파일에 쓰는 프로그램을 작성해보자.

infile = open("origin.txt", "r")
outfile = open("new.txt", "w")

i = 1
for line in infile:
    outfile.write(str(i) + " - " + line)
    i += 1

infile.close()
outfile.close()

This is first sentence
This is second sentence
This is third sentence

1 - This is first sentence
2 - This is second sentence
3 - This is third sentence

Binary File

이진 파일은 텍스트 파일과 다르게 바이너리 데이터가 그대로 저장되므로 효율성이 좋다. 텍스트 파일의 경우 데이터가 문자열로 변환되는 과정을 거치기 때문이다.

이진 파일에서 파일 입출력을 하는 경우, 모드를 "wb" 또는 "rb"로 지정해준다.
다음 예시와 같이 작성한다.

#파일 읽기
infile = open(filename, "rb")
bytesArray = infile.read(n) #파일에서 n바이트 읽기
#바이트형의 시퀀스 반환. 0부터 255까지의 값 가짐

#파일 쓰기
outfile = open(filename, "wb")
bytesArray = bytes([255, 128, 0, 1])
outfile.write(bytesArray)

파일 임의 접근

파일에서 동작이 이루어지는 위치를 표시하기 위해 위치 표시자(file pointer)가 존재한다. 새 파일 생성 또는 기존 파일 오픈 시 위치 표시자는 0으로 지정되고 이는 파일의 시작 부분을 가리킨다. append 모드에서는 위치 표시자가 파일의 끝을 가리킨다.

seek() 함수를 통해 위치 표시자를 지정하면 원하는 임의의 위치에서 읽고 쓰기가 가능하다.
다음 예시를 보자.

tell() 함수는 현재 위치 표시자의 위치를 반환한다. 단위는 바이트이다.

profile
파인애플 좋아하세요?

0개의 댓글