Как сохранить и восстановить несколько переменных в Python? - PullRequest
86 голосов
/ 04 июля 2011

Мне нужно сохранить около десятка объектов в файл, а затем восстановить их позже.Я пытался использовать цикл for с pickle и shelve, но он не работал правильно.

Edit.
Все объекты, которые я пытался сохранить, были в одном классе (я долженупоминал об этом раньше), и я не осознавал, что могу просто сохранить весь класс следующим образом:

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'

Ответы [ 6 ]

140 голосов
/ 04 июля 2011

Если вам нужно сохранить несколько объектов, вы можете просто поместить их в один список или кортеж, например:

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=-1 в dump(); pickle будет тогда использовать лучший доступный протокол вместо исторического (и более обратно-совместимого) протокола по умолчанию. В этом случае файл должен быть открыт в двоичном режиме (wb и rb соответственно).

Бинарный режим также следует использовать с Python 3, так как его протокол по умолчанию создает двоичные (т.е. нетекстовые) данные (режим записи 'wb' и режим чтения 'rb').

42 голосов
/ 04 июля 2011

Существует встроенная библиотека с именем 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()
11 голосов
/ 04 июля 2011

Вы должны посмотреть на полки и рассол модулей.Если вам нужно хранить много данных, лучше использовать базу данных

4 голосов
/ 21 мая 2014

Вы можете использовать klepto, который обеспечивает постоянное кэширование памяти, диска или базы данных.

dude@hilbert>$ 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()
>>> 

Затем, после перезапуска переводчика ...

dude@hilbert>$ 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 голосов
/ 04 июля 2019

Другой подход к сохранению нескольких переменных в файл выбора:

import pickle

a = 3; b = [11,223,435];
pickle.dump([a,b], open("trial.p", "wb"))

c,d = pickle.load(open("trial.p","rb"))

print(c,d) ## To verify
0 голосов
/ 18 сентября 2018

Следующий подход кажется простым и может использоваться с переменными различного размера:

import hickle as hkl
# write variables to filename [a,b,c can be of any size]
hkl.dump([a,b,c], filename)

# load variables from filename
a,b,c = hkl.load(filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...