2011-07-04 40 views
54

Tôi cần lưu khoảng một tá đối tượng vào một tệp và sau đó khôi phục chúng sau này. Tôi đã cố gắng sử dụng vòng lặp for with pickle và shelve nhưng nó không hoạt động đúng.Làm cách nào để lưu và khôi phục nhiều biến trong python?

Chỉnh sửa.
Tất cả các đối tượng mà tôi đang cố gắng để tiết kiệm được trong cùng một lớp (Tôi có nên nói này trước đó), và tôi đã không nhận ra rằng tôi chỉ có thể tiết kiệm cả lớp như thế này:

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

Xin vui lòng gửi một mẫu mã – Yossi

+1

Bạn nói rằng bạn đã thử một vòng lặp for. Vui lòng đăng mã đó và tại sao "nó không hoạt động đúng" (tức là, những gì đã xảy ra và những gì bạn muốn xảy ra). – Blair

+0

Nếu bạn đang ở trên các cửa sổ, hãy đảm bảo mở các tệp ở chế độ nhị phân –

Trả lời

9

Bạn nên xem các mô-đun shelvepickle. Nếu bạn cần lưu trữ nhiều dữ liệu, có thể tốt hơn nếu bạn sử dụng cơ sở dữ liệu

27

Có thư viện tích hợp được gọi là pickle. Sử dụng pickle bạn có thể đổ các đối tượng vào một tệp và tải chúng sau này.

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

Tôi Python 3.4 sử dụng: 'f = open ('store.pckl', 'wb')' để mở một tệp để ghi vào. Tham khảo http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytes Và sử dụng 'f = open ('store.pckl', 'rb') để mở một tập tin cần đọc. Tham khảo http://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interface. – user3731622

+0

có cụ thể là 3.4+ không? Tôi gần như đã bỏ phiếu cho câu trả lời vì nó tạo ra lỗi khi bạn không sử dụng 'b'. –

93

Nếu bạn cần phải lưu nhiều đối tượng, bạn chỉ có thể đặt chúng trong một danh sách duy nhất, hoặc tuple, ví dụ:

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) 

Nếu bạn có rất nhiều dữ liệu, bạn có thể giảm kích thước tệp bằng cách đi qua protocol=-1 đến dump(); pickle sau đó sẽ sử dụng giao thức có sẵn tốt nhất thay vì giao thức lịch sử mặc định (và tương thích ngược). Trong trường hợp này, tệp phải được mở ở chế độ nhị phân (wbrb, tương ứng).

Chế độ nhị phân cũng nên được sử dụng với Python 3, vì giao thức mặc định của nó tạo dữ liệu nhị phân (tức là không phải văn bản) (chế độ viết 'wb' và chế độ đọc 'rb').

+4

Trong Python 3.5, tôi phải mở tệp ở chế độ "byte", ví dụ: 'với mở ('objs.pickle', 'wb') là f:' (lưu ý 'wb'). – kbrose

+1

Điểm tốt. Tôi đã thêm nó vào câu trả lời. – EOL

2

Bạn có thể sử dụng klepto, cung cấp bộ nhớ đệm liên tục cho bộ nhớ, đĩa hoặc cơ sở dữ liệu.

[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() 
>>> 

Sau đó, sau khi thông dịch khởi động lại ...

[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 
>>> 

Lấy mã ở đây: https://github.com/uqfoundation

+0

Đây không phải là built-in ... – Zizouz212

+5

OP không yêu cầu tích hợp sẵn. –

Các vấn đề liên quan