2025. 7. 12. 13:17ㆍProgramming Language/Python
파이썬에서 피클(pickle) 은 객체를 직렬화(serialize)하거나 역직렬화(deserialize)하기 위한 모듈이다.
피클을 사용하는 이유는 프로그램 종료 후에도 객체 상태를 파일로 저장하고 싶을 때, 네트워크를 통해 객체를 주고받고 싶을 때, 데이터베이스에 직접 넣기 힘든 파이썬 객체를 저장하고자 할 때 사용된다.
프로젝트를 할때 exe파일을 생성해서 설정에 대한 내용을 DB에도 저장하지만 로컬 내부에서도 파일의 형태로 저장하기 위해서 사용했던 경험이 있는데 이럴때 사용하는 것 같아 보인다.
응용프로그램을 배포를 하면 해당 프로그램의 버전정보, 데이터를 전송시키기 위한 URL, 혹은 exe파일 내부에서 설정하는 설정값들이 DB로 가지 않고 로컬 데이터를 확인해서 설정한 값을 통해 로직을 변경하게 되는데 이런 것들이 피클을 통해서 사용되는 것으로 보인다.
직렬화(Serialization)
파이썬 객체(예: 리스트, 딕셔너리, 클래스 인스턴스 등)를 바이트(byte) 형태로 변환해 저장하거나 전송할 수 있도록 만드는 과정으로 객체 → 바이트 스트림의 과정이다.
역직렬화(Deserialization)
저장하거나 전송받은 바이트 데이터를 다시 원래의 파이썬 객체로 복원하는 과정으로 바이트 스트림 → 객체의 과정이다.
피클을 사용하는 방법은 사실 파일의 입력과 출력의 방식의 옵션 및 사용 방법을 변경하는 정도의 차이이다.
피클을 사용할때는 항상 바이너리의 형태로 읽고 써야하기에 항상 두번째 옵션을 "wb"혹은 "rb"와 같이 바이너리 옵션을 추가해서 사용해야만 한다.
피클로 객체를 파일에 저장하기 (직렬화)
피클로 객체를 저장할때에는 파일로 데이터를 출력할때 pickle이라는 객체의 dump라는 메서드에 전달하여 저장한다.
import pickle
data = {'name': 'Alice', 'age': 25, 'city': 'Seoul'}
# pickledFile이라는 객체로 파일을 wb모드로 열고
with open('data.pkl', 'wb') as pickledFile:
# picle의 dump 메서드로 data 객체를 파일로 저장함
pickle.dump(data, pickledFile)
dump 메서드는 첫번째 전달인자로 저장할 객체를 전달하고 두번째 전달인자로 저장할 파일 스트림 객체를 지정한다.
그래서 순서대로 dump(a, b)일때 a객체의 데이터를 바이너리로 b파일 스트림 객체에 연결된 파일에다 출력해서 저장한다
라는 의미가 된다.
보면 이렇게 저장이 되어 있다.
피클로 파일을 객체로 읽어오기 (역직렬화)
파일을 객체로 읽어 올때에는 pickle의 load라는 메서드를 사용한다.
load에는 파일 스트림 객체를 전달하고 응답을 변수에 저장하면 된다.
import pickle
pickleFile = open("data.pkl", "rb")
data = pickle.load(pickleFile)
print(data) # {'name': 'Alice', 'age': 25, 'city': 'Seoul'}
pickleFile.close()
### 다들 알겠지만 주의할 점은 파일을 만들때 파일의 명칭은 특정 라이브러리의 py파일명과 겹치면 사용이 안되니 주의 하자 ###
놀랍게 나는 이거 때문에 pickle모듈이 안불러져서 조금 혼란스러웠음...ㅋㅋ;