nan + nan = 2nan

[Python] pickle 파일 다루기 본문

Python

[Python] pickle 파일 다루기

2nan 2023. 4. 28. 18:36
728x90

Pickle?


- 텍스트 형태로 파일을 저장하는 것이 아닌, 객체 자체를 바이너리 형태로 저장하는 형식

 파이썬에서 사용하는 딕셔너리, 리스트, 클래스 등의 자료형을 변환 없이 그대로 파일로 저장하고 이를 불러올 때 사용하는 모듈

Pickling

- 파이썬 객체를 pickle 파일로 저장 (pickle.dump())

Unpickling

- pickle 파일에서 객체를 읽어오는 과정 (pickle.load())


코드 예시

import pickle # 모듈 임포트

# 저장할 딕셔너리 데이터 생성
data = {}	
data[1] = {'no': 1, 'subject': '안녕 피클', 'content': '피클은 매우 간단합니다.'}

# 딕셔너리를 pickle 파일로 저장
with open('data.p', 'wb') as f: # 'data.p' 파일에 data를 dump() 메소드를 사용하여 저장
	pickle.dump(data, f)

# 저장한 pickle 파일 불러오기
with open("data.p", 'rb') as f:
	data = pickle.load(f)
    
print(data)
# 결과
{1: {'no': 1, 'subject': '안녕 피클', 'content': '피클은 매우 간단합니다.'}}

다음과 같이 dump 메소드를 사용하여 저장하고, load 메소드를 사용하여 불러온다.

저장 시, 바이너리 데이터로 저장하기 때문에 우리 눈으로 읽을 수 있는 데이터 형태가 아니다.


장점

  • 사용하는 이유 중 하나는 속도 측면
    • 텍스트 파일을 읽을 때 필요한 부분들을 전체에서 파싱해서 가져와야 하지만,
      pickle 파일은 이미 필요한 형태로 저장이 되어 있기 때문에 훨씬 빠르다.

단점

  • 불안전성
    • 검증되지 않은 pickle data를 Unpickling하다 임의의 코드가 실행될 가능성(RCE, 원격코드실행)이 존재함
  • 버전 호환성
    • 만약 다른 사람에게 pickle 파일을 만들어 보내줬는데, 그 사람의 pickle 모듈 버전과 나의 pickle 모듈 버전이 다를 경우
      파일이 작동하지 않을 가능성이 크다고 한다.

 

이전에 첫 프로젝트 당시, pickle 파일로 array 값을 관리를 했었는데 지금 생각해보면 아마 속도 측면에서 해당 파일 형식을 택한게 아닌가 싶다.

실제 서비스를 적용하는 것이 아니기 때문에, 보안 측면의 문제보다 당장의 퍼포먼스가 중요해서 그랬던 것 같은데, 보통 나는 pickle data보다 json 형식의 data를 많이 사용해서 잘 모르겠다.

나중에 json에 대한 글을 쓰면서, pickle과의 차이점도 분석해봐야겠다.

Comments