2010-08-04 7 views
1

이 Pickle 예제가 두 사전 정의를 모두 표시하지 않는 이유가 확실하지 않습니다. 필자가 이해하는 바와 같이, "ab +"는 pickle.dat 파일이 추가되고 읽을 수 있음을 의미합니다. 나는 전체적인 피클 컨셉을 처음 접했지만 그물에 관한 튜토리얼은 단지 초기 저장 장치를 넘어서는 것처럼 보이지 않는다. 일부 RAM을 절약하기 위해 사전을 pickle.dat 파일에 값 쌍, 다음 취소 :Python Pickle Help

import cPickle as pickle 

def append_object(d, fname): 
    """appends a pickle dump of d to fname""" 
    print "append_hash", d, fname 
    with open(fname, 'ab') as pickler: 
     pickle.dump(d, pickler) 

db_file = 'pickle.dat' 

cartoon = {} 
cartoon['Mouse'] = 'Mickey' 
append_object(cartoon, db_file) 

cartoon = {} 
cartoon['Bird'] = 'Tweety' 
append_object(cartoon, db_file) 

print 'loading from pickler' 
with open(db_file, 'rb') as pickler: 
    cartoon = pickle.load(pickler) 
print 'loaded', cartoon 

이상적으로, 나는 루프를 사용하여 사전을 구축 한 다음 키를 추가 기대했다.

여기 무슨 일 이니?

+0

하지 이중 공간 코드를 수행합니다. 4 칸으로 들여 쓰기하십시오. –

답변

5

피클을 사용하지 마십시오. 데이터베이스를 사용하십시오.

파이썬 dbm module 완벽하게 원하는 것 같습니다. 사전과 같은 인터페이스를 제공하지만 데이터는 디스크에 저장됩니다.

사용 예제 :

>>> import dbm 
>>> x = dbm.open('/tmp/foo.dat', 'c') 
>>> x['Mouse'] = 'Mickey' 
>>> x['Bird'] = 'Tweety' 

내일 당신이 데이터를로드 할 수

>>> import dbm 
>>> x = dbm.open('/tmp/foo.dat', 'c') 
>>> print x['Mouse'] 
Mickey 
>>> print x['Bird'] 
Tweety 
+0

오, 내 dbm 모듈이 dbm으로 바뀌 었습니다. dbm 모듈이 dbm으로 바뀌 었습니다. – Brian

+0

참고 : Python 웹 사이트에 따르면 : "dbm 모듈의 이름이 dbm으로 바뀌 었습니다. 파이썬 3.0에서 ndbm .2to3 도구는 소스를 3.0으로 변환 할 때 자동으로 가져 오기를 적용합니다. " – Brian

+0

또한이 모듈이 유닉스 용 모듈이라는 것을 알았습니다. 윈도우 7에서 코딩 중입니다 ... – Brian

3

가독성을 위해 코드를 편집하기 시작했으며 그 과정에서 append_object을 고려했습니다.

여기에는 여러 개의 혼동이 있습니다. 첫 번째로, pickle.dump은 파이썬 객체 전체를 작성합니다. 피클 파일에 여러 객체를 넣을 수 있지만 각 객체는 자체적으로 load이 필요합니다. 코드는 요청한 내용을 수행하고 작성한 첫 번째 사전을 파일에로드합니다. 두 번째 사전은 읽으려고 기다리고 있었지만 첫 번째 사전과의 연결이 아니며 자체로드 가능합니다.

이름의 중요성을 과소 평가하지 마십시오. append_object은 훌륭한 이름은 아니지만 append_to_object과 다릅니다.

읽기 용으로 파일을 여는 경우 읽기 전용으로 열고 쓰기 또는 추가 용으로 열면됩니다. 그것은 당신의 의도를 더 분명하게 할뿐만 아니라 어리석은 실수를 예방합니다.

+0

내 코드를 블록에 넣어 주셔서 감사합니다 ... 나는 그걸 알아 내려고 노력했습니다. 어떻게 그걸합니까? 참조에 따르면 코드 블록에 들어가고 싶은 부분의 시작과 끝 부분에 '작은 따옴표'를 입력하는 것처럼 보입니다. 그러나 그것은 저를 위해 작동하지 않았습니다. = ( – Brian

+0

@Brian, 당신은 코드를 줄에 넣습니다. 큰 코드 블록의 경우 모든 코드 줄의 시작 부분에 네 칸을 추가하거나 단순히 코드를 작성할 수 있습니다 공백없이 강조 표시 한 다음 1과 0처럼 보이는 코드 샘플 버튼을 클릭하십시오 – Wilduck

+0

필자 파일의 두 정의를 모두 담기 위해 위의 코드를 수정하는 방법은 아직 확실하지 않습니다 ... – Brian