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

파일에서 문자열만 읽고 쓴다면 조금 불편하겠죠? 파이썬은 객체를 파일에 저장하는 pickle 모듈을 제공합니다.

다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링(pickling)이라고 하고, 파일에서 객체를 읽어오는 과정을 언피클링(unpickling)이라고 합니다.

그림 27-3 피클링과 언피클링

27.3.1  파이썬 객체를 파일에 저장하기

그럼 파이썬 객체를 파일에 저장하는 피클링을 해보겠습니다. 피클링은 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:    # james.p 파일을 바이너리 쓰기 모드(wb)로 열기
    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) 파일이라고 부릅니다.

27.3.2  파일에서 파이썬 객체 읽기

이제 파일에서 파이썬 객체를 읽어오는 언피클링을 해보겠습니다. 언피클링은 pickle 모듈의 load를 사용합니다. 그리고 언피클링을 할 때는 반드시 파일 모드를 바이너리 읽기 모드 'rb'로 지정해야 합니다.

pickle_load.py

import pickle
 
with open('james.p', 'rb') as file:    # james.p 파일을 바이너리 읽기 모드(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', 배타적 생성 'x'도 있습니다. 추가 모드는 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고, 배타적 생성 모드는 파일이 이미 있으면 에러(FileExistsError)를 발생시키고 없으면 파일을 만듭니다. 'x'는 베타적 생성(exclusive creation)의 x입니다

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

그다음에 '+'가 있는데 파일을 읽기/쓰기 모드로 엽니다. 이 모드는 'r+t', 'w+t', 'r+', 'w+', 'r+b', 'w+b' 등으로 조합할 수 있으며 읽기/쓰기 모드인 것은 같지만 파일 처리 방법이 조금씩 다릅니다.

지금까지 나온 파일 모드 조합을 그림으로 정리하면 다음과 같은 구조가 됩니다.

그림 27-4 파일 모드 조합