2022년 6월 18일 토요일

python pickle (python 변수를 파일로 저장하기)

pickle 이란

python에 존재하는 변수 or Class를 저장할 수 있는 패키지입니다. 굉장히 유용하게 사용 할 수 있습니다.


변수를 저장하기

pickle.dump(변수이름, 파일핸들)


변수를 불러오기

변수명=pickle.load(파일핸들)


예제

예제는 3개의 변수를 dictionary type 과 list 형태를 조합한 형태와 상수형 포함하여 3가지 변수를 저장하고 읽어오는 예제입니다.

import pickle

data1 = ["xso", 10, 100,{"test":"hello","kim":"illy"}]
data2 = {"ver":1, "tar":2, "zcb":[3,2,1]}
data3 = 20

print(data1)
print(data2)
print(data3)

with open("test.pickle", "wb") as f:
    pickle.dump(data1, f)
    pickle.dump(data2, f)
    pickle.dump(data3, f)


with open("test.pickle", "rb") as f:
    l1 = pickle.load(f)
    l2 = pickle.load(f)
    l3 = pickle.load(f)

print(l1)
print(l2)
print(l3)


실행 결과

['xso', 10, 100, {'test': 'hello', 'kim': 'illy'}]
{'ver': 1, 'tar': 2, 'zcb': [3, 2, 1]}
20
['xso', 10, 100, {'test': 'hello', 'kim': 'illy'}]
{'ver': 1, 'tar': 2, 'zcb': [3, 2, 1]}
20

저장전 값과 저장후 값이 같음을 알 수 있습니다.


주의 해야 할 점

pickle로 저장된 파일이 손상된 경우 어떻게 동작하는지 살펴 보았습니다.

기존에 생성된 test.pickle 파일을 수동으로 이것저것 변경해 보고 아래 코드에서 저장한 코드를 삭제한채 load함수로 읽어들이는 부분으로 테스트 해보았습니다.

import pickle

with open("test.pickle", "rb") as f:
    l1 = pickle.load(f)
    l2 = pickle.load(f)
    l3 = pickle.load(f)

print(l1)
print(l2)
print(l3)


테스트 결과

C:\Users\example\_43_pickle>python pickle_load.py
['xso', 10, 100, {'test': 'hello', 'kim': 'illy'}]
{'ver': 1, 'tar': 2, 'zcb': [3, 2, 1]}
20

C:\Users\example\_43_pickle>python pickle_load.py
Traceback (most recent call last):
  File "pickle_load.py", line 5, in <module>
    l2 = pickle.load(f)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 3: invalid start byte

C:\Users\example\_43_pickle>python pickle_load.py
Traceback (most recent call last):
  File "pickle_load.py", line 5, in <module>
    l2 = pickle.load(f)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 3: invalid start byte

C:\Users\example\_43_pickle>python pickle_load.py
Traceback (most recent call last):
  File "pickle_load.py", line 5, in <module>
    l2 = pickle.load(f)
MemoryError

어떤 값을 고치냐에 따라 Exception이 발생하는 경우도 있고 아닌 경우도 있습니다. Exception 종류도 여러가지가 발생하고 있습니다.

따라서 신뢰성이 필요한 곳에는 check sum 값을 같이 저장해서 해당 값이 유효한지 검사하는 기능을 추가로 해야 할 것으로 보입니다.


댓글 없음:

댓글 쓰기