2016-09-02 2 views
0

나는 간단한 작업을 수행하려고 :
1. 역 직렬화 이전에 직렬화 된 객체를
2. 업데이트를 나중에 다시 그것을 직렬화 객체
3.파이썬 : 업데이트 직렬화 객체

I을 사용하십시오 운이없는 pickle으로 해보려고했습니다.

empty_list = [] 
f = open('backup.p', 'wb') 
pickle.dump(empty_list, f) 
f.close() 

이상 : :
나는이 일을하여 시작

f = open('backup.p', 'rb+') 
l = pickle.load(f) 
l.append('string') 
pickle.dump(l, f) 
f.close() 

을하지만 다시 가정으로 업데이트 된 목록로드하려고하면

f = open('backup.p', 'rb') 
updated_list = pickle.load(f) 
print(updated_list) # prints [] instead of ['string'] 
f.close() 

왜 두 번째를하지 않습니다 dump()으로 전화하면 backup.p의 내용을 새 목록 ['string']으로 덮어 쓰시겠습니까? 원하는 동작을 얻으려면 buckup.p을 제거해야합니까? 이 후

답변

3

: 당신이 empty_list의 피클 후 파일의 시점에서 파일 객체 f을 배치 한

f = open('backup.p', 'rb+') 
l = pickle.load(f) 

. 즉, 다른 오브젝트를 파일에 덤프 할 때 다음을 의미합니다.

pickle.dump(l, f) 

첫 번째 피클 후에 새 피클이 기록됩니다. 당신은 어느 새 피클를 덤프하기 전에 파일을 삭제하여 피할 필요 :

f.seek(0) 
f.truncate() 

하거나 새 파일로 덤프하고 새로운 하나를 사용하여 원본 파일을 교체하여

. (검색, 잘라 내기, 덤프를 수행하는 대신 끝에있는 덤프를 찾아서 덤프 할 수 있습니다.)

+0

두 번째 덤프 바로 전에 f.truncate (0) '예를 들어) 나중에 추적하려고 할 때'KeyError' 예외가 발생합니다 : "'Traceback (최근 호출 마지막) : 파일"./test.py ", 줄 28, updated_list = pickle. load (f) 파일 "/usr/lib64/python2.6/pickle.py"1370 행로드 반환 Unpickler (파일) .load() 파일 "/usr/lib64/python2.6/pickle. py ", 858 행,로드 중 디스패치 [key] (self) KeyError : '\ x00''" –

+0

@ so.very.tired : 나는'truncate'를 조금 잘못 이해 한 것처럼 보입니다. 잘린 파일이 파일의 현재 위치보다 짧으면 실제로 파일 위치를 이동시키지 않으므로'seek'와'truncate'가 모두 필요합니다. – user2357112

+0

예. 그것은 나를 위해 일했다. 감사! –