17. 파일(File)
1. 키워드
- 파일 객체(File Object)
- 피클링(Pickling)과 언피클링(Unpickling)
2. 파일 사용하기
- 프로그래밍에서 중요한 축을 차지하는 부분이 파일 처리이다.
3. 파일에 문자열 쓰기, 읽기
- 이제부터 파일에 문자열을 써서 파일을 만든 뒤에 만든 파일을 읽는 순서로 진행한다.
1) 파일에 문자열 쓰기
- 파일에 문자열을 쓸 때는
open
함수로 파일을 열어서 파일 객체를 얻은 뒤에write
메서드를 사용한다.
- 파일을 사용하기 위해서는 먼저
open
함수로 파일을 열어서 파일 객체를 얻어야 한다. - 또한 파일에 내용을 쓸 것이므로 파일 모드를
"w"
로 지정해 준다.
- 이제 파일 객체를 얻었으니
write
로 파일에 문자열을 쓴다.
- 파일 쓰기가 끝났으면 반드시
close
로 파일 객체를 닫아준다.
2) 파일에서 문자열 읽기
- 파일을 읽을 때도
open
함수로 파일을 열어서 파일 객체를 얻은 뒤read
메서드로 파일의 내용을 읽는다.
- 먼저
open
을 사용하여hello.txt
파일을 읽기 모드"r"
로 연다.
- 이제
read
의 반환값을 변수에 저장해 주면 파일의 내용을 읽을 수 있다.
- 마찬가지로 파일 읽기 작업이 끝났다면
close
로 파일 객체를 닫아준다.
3) 자동으로 파일 객체 닫기
- 파이썬에서는
with as
를 사용하면 파일을 사용한 뒤 자동으로 파일 객체를 닫아준다.
- 다음과 같이
with
다음에open
으로 파일을 열고as
뒤에 파일 객체를 지정한다.
read
로 파일을 읽고나서close
를 사용하지 않아도 된다.
4. 문자열 여러 줄을 파일에 쓰기, 읽기
- 이번에는 문자열 여러 줄을 파일에 쓰고 읽는 방법을 알아보자.
1) 반복문으로 문자열 여러 줄을 파일에 쓰기
- 문자열 여러 줄을 쓸 때는 간단하게 반복문을 사용하면 된다.
.py
파일이 있는 폴더의hello.txt
파일을 열어보면 다음과 같은 내용이 저장되어 있다.
- 만약
\n
을 붙이지 않으면 문자열이 모두 한 줄로 붙어서 저장되므로 주의해야 한다.
2) 리스트에 들어있는 문자열을 파일에 쓰기
- 이번에는 리스트에 들어있는 문자열을 파일에 써보자.
lines = ["안녕하세요.\n", "파이썬\n", "코딩 도장입니다.\n"]
with open("hello.txt", "w") as file:
file.writelines(lines)
writelines
는 리스트에 들어있는 문자열을 파일에 쓴다.
3) 파일의 내용을 한 줄씩 리스트로 가져오기
read
는 파일의 내용을 읽어서 문자열로 가져오지만readlines
는 파일의 내용을 한 줄씩 리스트 형태로 가져온다.
with open("hello.txt", "r") as file:
lines = file.readlines()
print(lines) # ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
4) 파일의 내용을 한 줄씩 읽기
- 만약 파일의 내용을 한 줄씩 순차적으로 읽으려면
readline
을 사용한다.
with open("hello.txt", "r") as file:
line = None
while line != "":
line = file.readline()
print(line.strip("\n"))
- 파일에 문자열이 몇 줄이나 있는지 모르기 때문에
readline
으로 파일을 읽을 때는while
반복문을 활용해야 한다.
5) for 반복문으로 파일의 내용을 줄 단위로 읽기
- 파이썬에서는
for
반복문으로 좀 더 간단하게 파일의 내용을 읽을 수 있다.
- 이렇게
for
반복문에 파일 객체를 지정하면 반복을 할 때마다 파일의 내용을 한 줄씩 읽어서 변수에 저장해 준다.
파일 객체는 이터레이터
- 파일 객체는 이터레이터이기 때문에 변수 여러 개에 저장하는 언패킹도 가능하다.
>>> file = open("hello.txt", "r")
>>> a, b, c = file
>>> a, b, c
('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')
- 할당할 변수의 개수와 파일에 저장된 문자열의 줄 수가 일치해야 한다.
5. 파이썬 객체를 파일에 저장하기, 가져오기
- 파이썬은 객체를 파일에 저장하는
pickle
모듈을 제공한다.
- 다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링이라고 하고, 파일에서 객체를 읽어오는 과정을 언피클링이라고 한다.
1) 파이썬 객체를 파일에 저장하기
- 파이썬 객체를 파일에 저장하는 피클링을 해보자.
- 피클링은
pickle
모듈의dump
메서드를 사용한다.
import pickle
name = "james"
age = 17
address = "서울시 서초구 반포동"
scores = {"korean": 90, "english": 95, "mathematics": 85, "science": 82}
with open("james.p", "wb") as file:
pickle.dump(name, file)
pickle.dump(age, file)
pickle.dump(address, file)
pickle.dump(scores, file)
- 소스 코드를 실행하면
.py
파일이 있는 폴더에james.p
파일이 생성된다. - 여기서는 확장자를
pickle
의p
를 사용했지만 다른 확장자를 사용해도 상관없다. - 특히
pickle.dump
로 객체(값)를 저장할 때는open("james.p", "wb")
와 같이 파일 모드를"wb"
로 지정해야 한다. b
는 바이너리(Binary)를 뜻하는데, 바이너리 파일은 컴퓨터가 처리하는 파일 형식이며 메모장 같은 텍스트 편집기로 열어도 사람이 알아보기 어렵다.
2) 파일에서 파이썬 객체 읽기
- 파일에서 파이썬 객체를 읽어오는 언피클링을 해보자.
- 언피클링은
pickle
모듈의load
를 사용하며, 언피클링을 할 때는 반드시 파일 모드를 바이너리 읽기 모드"rb"
로 지정해야 한다.
import pickle
with open("james.p", "rb") as file:
name = pickle.load(file)
age = pickle.load(file)
address = pickle.load(file)
scores = pickle.load(file)
print(name) # 'james'
print(age) # 17
print(address) # '서울시 서초구 반포동'
print(scores) # {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
- 앞에서
james.p
파일을 저장할 때pickle.dump
를 네 번 사용했다. - 마찬가지로 파일에서 객체(값)를 가져올 때도
pickle.load
를 네 번 사용해야 한다. - 즉,
name
,age
,address
,scores
순으로 저장했으므로 가져올 때도 같은 순서로 가져오면 된다.
다른 파일 모드는 없나요?
- 파일 모드는 조합에 따라 여러 종류가 있다.
- 읽기
"r"
, 쓰기"w"
이외에 추가"a"
, 배타적 생성"x"
도 있다. - 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러(
FileExistsError
)를 발생시키고 없으면 파일을 만든다. - 또한 파일의 형식도 함께 지정할 수 있는데, 텍스트 모드
"t"
와 바이너리 모드"b"
가 있다. - 이 파일 형식과 읽기, 쓰기 모드를 조합한 텍스트 모드
"rt"
,"wt"
는 파일을 텍스트 모드로 연다. - 특히 텍스트 모드는 생략할 수 있어서 그냥
"r"
,"w"
도 텍스트 모드이다. - 그리고 바이너리 모드
"rb"
,"wb"
등은 피클링을 사용하거나 바이너리 데이터를 직접 저장할 때 사용한다. - 그다음에
"+"
가 있는데 파일을 읽기/쓰기 모드로 연다. - 이 모드는
"r+t"
,"w+t"
,"r+"
,"w+"
,"r+b"
,"w+b"
등으로 조합할 수 있으며 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다르다.
- 지금까지 나온 파일 모드 조합을 그림으로 정리하면 다음과 같은 구조가 된다.