2011-07-04 7 views
54

약 12 ​​개의 개체를 파일로 저장 한 다음 나중에 복원해야합니다. 피클 선반과 for 루프를 사용하려고했지만 올바르게 작동하지 않았습니다.어떻게 저장하고 파이썬에서 여러 변수를 복원합니까?

편집.
내가 같은 클래스에 있던 구하려고 한 모든 개체 (내가 전에이 문제를 언급한다), 그리고 난 그냥이 같은 학급 전체 절약 할 수 있음을 인식하지 않았다

def saveLoad(opt): 
    global calc 
    if opt == "save": 
     f = file(filename, 'wb') 
     pickle.dump(calc, f, 2) 
     f.close 
     print 'data saved' 
    elif opt == "load": 
     f = file(filename, 'rb') 
     calc = pickle.load(f) 
    else: 
     print 'Invalid saveLoad option' 
+1

샘플 코드 – Yossi

+1

를 게시하시기 바랍니다 당신은 루프를 시도했습니다 말한다. 해당 코드를 게시하고 "올바르게 작동하지 않았습니다"(즉, 발생한 상황과 발생하려는 상황) 이유를 적어주십시오. – Blair

+0

Windows를 사용하는 경우 파일을 이진 모드로 엽니 다. –

답변

9

shelvepickle 모듈을 확인해야합니다. 많은 양의 데이터를 저장해야하는 경우 데이터베이스를 사용하는 것이 더 좋습니다

27

pickle이라는 내장 라이브러리가 있습니다. pickle을 사용하면 개체를 파일로 덤프하고 나중에로드 할 수 있습니다. 당신은 여러 개체를 저장해야하는 경우

import pickle 

f = open('store.pckl', 'wb') 
pickle.dump(obj, f) 
f.close() 

f = open('store.pckl', 'rb') 
obj = pickle.load(f) 
f.close() 
+1

파이썬 3.4에서는 다음과 같이 쓰고있다 :'f = open ('store.pckl', 'wb')'쓸 파일을 여는 것이다. http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytes를 참조하십시오.'f = open ('store.pckl', 'rb')을 사용하여 읽을 파일. http://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interface를 참조하십시오. – user3731622

+0

은 3.4+에 고유 한 것입니까? 나는 'b'를 사용하지 않을 때 오류를 생성하기 때문에 거의 응답을 포기했다. –

93

, 당신은 단순히 예를 들어, 하나의리스트 또는 튜플에 넣어 수 있습니다 : 당신은 많은 양의 데이터가있는 경우

import pickle 

# obj0, obj1, obj2 are created here... 

# Saving the objects: 
with open('objs.pkl', 'w') as f: # Python 3: open(..., 'wb') 
    pickle.dump([obj0, obj1, obj2], f) 

# Getting back the objects: 
with open('objs.pkl') as f: # Python 3: open(..., 'rb') 
    obj0, obj1, obj2 = pickle.load(f) 

, 당신은 줄일 수 있습니다 protocol=-1dump()에 전달하여 파일 크기를 조정하십시오. 그러면 pickle은 기본 기록 (및 이전 버전과 호환되는) 프로토콜 대신 가장 사용 가능한 프로토콜을 사용합니다. 이 경우 파일을 이진 모드 (각각 wbrb)로 열어야합니다.

기본 프로토콜이 이진 (즉, 텍스트가 아닌) 데이터 (쓰기 모드 'wb' 및 읽기 모드 'rb')를 생성하므로 이진 모드는 Python 3에서도 사용해야합니다.

+4

Python 3.5에서 "byte"모드로 파일을 열어야했습니다. '('objs.pickle', 'wb')을 f :'('wb '에 유의하십시오. – kbrose

+1

좋은 지적. 나는 대답에 그것을 덧붙였다. – EOL

2

메모리, 디스크 또는 데이터베이스에 영구적으로 캐싱을 제공하는 klepto을 사용할 수 있습니다.

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db['1'] = 1 
>>> db['max'] = max 
>>> squared = lambda x: x**2 
>>> db['squared'] = squared 
>>> def add(x,y): 
... return x+y 
... 
>>> db['add'] = add 
>>> class Foo(object): 
... y = 1 
... def bar(self, x): 
...  return self.y + x 
... 
>>> db['Foo'] = Foo 
>>> f = Foo() 
>>> db['f'] = f 
>>> db.dump() 
>>> 

그런 다음, 통역 다시 시작한 후 ...

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db 
file_archive('foo.txt', {}, cached=True) 
>>> db.load() 
>>> db 
file_archive('foo.txt', {'1': 1, 'add': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True) 
>>> db['add'](2,3) 
5 
>>> db['squared'](3) 
9 
>>> db['f'].bar(4) 
5 
>>> 

여기에 코드를 가져옵니다 : https://github.com/uqfoundation

+0

이것은 내장되어 있지 않습니다 ... – Zizouz212

+5

OP는 내장을 요구하지 않았습니다. –

관련 문제