티스토리 뷰

컴퓨터로 문서 작업을 하다가 갑자기 프로그램이 먹통이 되면서 '응답 없음' 상태로 빠지는 아찔한 경험은 아마 한 번씩 해보셨을 겁니다. 운이 좋으면(?) 잠시 후에 정상으로 돌아오기도 하지만 많은 경우에는 프로그램이 비정상 종료됩니다. 해가 갈수록 자동 저장 기능이 프로그램마다 잘 제공되고 있어서 다시 파일을 열어 보면 그래도 어느 정도까지 작업한 분량이 남아있지만 과거에는 송두리째 작업 내용을 날리는 경우도 많았지요. 그러다 보니 습관적으로 저장 단축키인 Ctrl + s 를 눌러서 지금까지 하던 작업을 수시로 저장했던 기억이 납니다.

 

파이썬으로 작성한 프로그램이 실행될때는 일반적으로 많은 변수가 생겼다가 사라지고, 변수의 값도 자주 변하게 마련입니다. 새로운 리스트를 하나 만들어서 연속된 숫자 데이터를 집어 넣고, 그 중에 몇 개는 삭제를 했다가 또 새로운 데이터를 추가하기도 하는 것처럼 말이죠. print() 를 통해 데이터가 어떻게 바뀌는지 확인할 수 있지만, 프로그램의 실행이 종료되고 나면 이 모든 데이터는 흔적도 없이 사라지게 됩니다.

 

그런데 만약 이 리스트 데이터를 또 사용해야 한다면 어떻게 할 수 있을까요? 또는 다른 프로그램에서 이 데이터를 필요로 한다거나, 다른 누군가가 만든 리스트 데이터를 가져와서 사용하려고 한다면요?

 

프로그램은 실행이 끝나버리면 모든 데이터가 사라진다고 했으므로 끝나기 전에 어딘가 저장을 해야겠지요. 이 때 사용할 수 있는 것이 바로 pickle 입니다. pickle 은 프로그램에서 사용하고 있는 데이터를 파일 형태로 저장하거나 불러올 수 있게 해주는 모듈입니다.

 

먼저 pickle 을 이용하여 데이터를 파일로 저장을 할 때는 dump() 라는 함수를 사용하는데요. 첫 번째 전달값으로는 저장할 데이터를, 두 번째 전달값으로는 데이터를 저장할 파일을 적어줍니다.

dump(data, dest_file)

 

어떤 사람의 프로필 데이터를 만들고 저장하는 예제를 들어볼게요.

 

먼저 pickle 모듈을 가져다 쓰기 위해 import 를 해주겠습니다.

이어서 파일을 하나 열 텐데 파일 이름은 "profile.pickle" 로 하고 쓰기 모드인 "w" 로 하는데, pickle 을 이용해서 저장되는 파일은 텍스트(text)가 아닌 바이너리(binary) 형태입니다. 일반적인 한글, 영어, 숫자 등의 내용을 담고 있는게 텍스트 파일이라면 .jpg, .png 와 같은 이미지나 .mp3 와 같은 음악, 또는 .exe 와 같은 실행 파일 등이 바이너리 파일이지요.

 

pickle 로 저장하는 파일 또한 바이너리 파일이기 때문에 open() 함수를 이용할 때 "w" 뒤에 "b" 를 붙여서 "wb" 라고 해야 올바르게 저장이 됩니다. 또한 데이터 내에 한글이 포함되어 있다 하더라도 별도의 encoding 은 지정할 필요가 없습니다.

 

조금 복잡한 데이터를 가지는 사전 형태의 profile 을 하나 만들고 그 사람의 이름, 나이 정보, 그리고 리스트 형태의 값을 가지는 여러 개의 취미를 정의합니다. print() 를 통해 출력해보면 입력한 데이터가 그대로 보이겠죠. 

 

그리고 앞에서 언급한 dump() 함수를 이용해서 파일로 저장을 하고, 마지막으로 close() 를 통해 파일을 닫아줍니다.

import pickle # pickle 모듈 가져다 쓰기

profile_file = open("profile.pickle", "wb") # 바이너리(binary) 형태로 저장
profile = {"이름":"박명수", "나이":30, "취미":["축구", "골프", "코딩"]}
print(profile)

pickle.dump(profile, profile_file) # profile 데이터를 file 에 저장
profile_file.close()

코드를 실행하면 profile 에 들어있는 데이터가 출력되고 워크스페이스 내에 profile.pickle 이라는 파일이 생긴 것을 확인할 수 있을텐데요. 이 파일은 바이너리 형태로 저장되었기 때문에 비주얼 스튜디오 코드나 파일 에디터 프로그램에서 열어도 그 내용을 올바르게 확인할 수는 없습니다. 아름다운 피아노 선율을 글자로 볼 수는 없듯이 말이죠.

 

잠깐!
Q) pickle 사용 시 아래와 같이 에러가 나는데 어떻게 해야 하나요?
AttributeError: partially initialized module 'pickle' has no attribute 'dump or load' (most likely due to a circular import)

A) 소스코드 작성중인 파일명을 pickle.py 로 하셨을텐데 my_pickle.py 등과 같이 변경해주셔야 합니다. 사용하시려는 모듈과 동일한 이름으로 파일을 생성하면 import 시에 동일한 경로에 있는 이 파일을 먼저 인식하게 되기 때문에 그렇습니다.

 

이번에는 데이터가 정말 잘 저장되었는지 확인하기 위해 앞에서 만든 파일을 다시 불러올텐데요. 이 때는 load() 함수를 이용하고 전달값으로는 파일을 작성하면 됩니다.

load(src_file)

먼저 파일을 열텐데 저장할 때와 마찬가지로 읽기 모드(r)에서도 바이너리 파일이기 때문에 "b" 를 붙여서 "rb" 라고 하구요. load() 함수를 통해서 이 파일을 전달합니다. 그러면 좌항에 있는 profile 변수에 파일에서 불러온 데이터를 그대로 저장하게 되는 것이죠. 잘 불러왔는지 출력하고 나서 이번에도 close() 함수를 통해 파일을 닫아줍니다.

profile_file = open("profile.pickle", "rb") # 읽을 때에도 바이너리(binary) 명시
profile = pickle.load(profile_file) # file 에 있는 정보를 불러와서 profile 에 저장

print(profile)
profile_file.close()

 

코드를 실행해보면 저장할 때와 동일한 데이터를 그대로 불러온 것을 확인할 수 있습니다.

{'이름': '박명수', '나이': 30, '취미': ['축구', '골프', '코딩']}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함