29.3 파이썬 객체를 파일에 저장하기, 가져오기

파일에 문자열만 읽고 쓴다면 조금 불편하겠죠? 이번에는 파이썬 객체를 파일에 저장하고, 가져오는 방법을 알아보겠습니다.

파이썬 객체를 파일에 저장할 때는 pickle 모듈의 dump를 사용합니다.

pickle_dump.py

import pickle
 
name = 'james'
age = 17
address = '서울시 서초구 반포동'
scores = {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
 
with open('james.p', 'wb') as file:    # hello.txt 파일을 바이너리 쓰기 모드(rb)로 열기
    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)를 뜻하는데 바이너리 파일은 컴퓨터가 처리하는 파일 형식입니다. 따라서 메모장 같은 텍스트 편집기로 열어도 사람이 알아보기 쉽지 않습니다.

참고로 지금까지 사용한 .txt 파일은 사람이 알아보기 쉽도록 만든 파일 형식이며 텍스트(text) 파일이라고 부릅니다.

james.p 파일의 내용을 읽으려면 pickle 모듈의 load를 사용해야 합니다. 물론 파일 모드는 바이너리 읽기 모드 'rb'로 지정합니다.

pickle_load.py

import pickle
 
with open('james.p', 'rb') as file:    # hello.txt 파일을 바이너리 읽기 모드(rb)로 열기
    name = pickle.load(file)
    age = pickle.load(file)
    address = pickle.load(file)
    scores = pickle.load(file)
    print(name)
    print(age)
    print(address)
    print(scores)

실행 결과

james
17
서울시 서초구 반포동
{'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}

앞에서 james.p 파일을 저장할 때 pickle.dump를 네 번 사용했습니다. 따라서 파일에서 객체(값)를 가져올 때도 pickle.load를 네 번 사용해야 합니다. 그리고 name, age, address, scores 순으로 저장했으므로 가져올 때도 같은 순서로 가져왔습니다.

지금까지 파일을 읽고 쓰는 방법을 배웠습니다. 파일 처리는 프로그램을 만들 때 자주 사용되므로 사용 방법을 정확히 익히는 것이 좋습니다.

참고 | 다른 파일 모드는 없나요?

사실 파일 모드는 조합에 따라 여러 종류가 있습니다. 읽기 'r', 쓰기 'w' 이외에 추가 'a'도 있습니다. 추가 모드는 이미 있는 파일의 끝에 새로운 내용을 추가할 때 사용합니다.

또한, 파일의 형식도 함께 지정할 수 있는데 텍스트 모드 't'와 바이너리 모드 'b'가 있습니다. 텍스트 모드 'rt', 'wt'는 파일을 텍스트 모드로 엽니다. 특히 텍스트 모드는 생략할 수 있으며 'r', 'w'도 텍스트 모드입니다. 바이너리 모드 'rb', 'wb' 등은 pickle을 사용하거나 바이너리 데이터를 직접 저장할 때 사용합니다.

그다음에 '+'가 있는데 파일을 읽기/쓰기 모드로 엽니다. 'r+', 'w+', 'rb+', 'wb+' 등으로 조합할 수 있는데 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다릅니다. 파일 모드 조합을 그림으로 표현하면 다음과 같습니다.

28-3

마지막으로 'x', 'x+'는 파일이 이미 있으면 에러(FileExistsError)를 발생시킵니다. 'x'는 베타적 생성(exclusive creation)의 x입니다