2012-01-23 29 views
63

Tôi hiểu rằng Python tẩy là một cách để 'lưu trữ' một đối tượng Python theo cách mà không tôn trọng lập trình đối tượng - khác với đầu ra được viết bằng tệp txt hoặc DB.Tuần tự hóa Python - Tại sao chọn dưa?

Bạn có biết thêm chi tiết hoặc tham khảo trên những điểm sau đây:

  • nơi được ngâm đối tượng 'lưu trữ'?
  • lý do tại sao biểu tượng đối tượng bảo quản ngâm hơn, lưu trữ trong DB?
  • tôi có thể truy xuất các đối tượng được chọn từ một phiên trình bao Python sang phiên bản khác không?
  • bạn có các ví dụ quan trọng khi tuần tự hóa hữu ích không?
  • thực hiện tuần tự hóa với dưa chuột ngụ ý dữ liệu 'nén'?

Nói cách khác, tôi đang tìm kiếm tài liệu về tẩy - Python.doc giải thích cách triển khai dưa nhưng dường như không đi sâu vào chi tiết về việc sử dụng và cần thiết phải tuần tự hóa.

+0

Để lưu trạng thái để khôi phục sau này hoặc để chia sẻ/sao chép một đối tượng vào thời gian chạy python khác nhau sẽ là phỏng đoán của tôi. – synthesizerpatel

+12

Nhiều câu hỏi của bạn được trả lời bởi bài viết của Wikipedia về serialization: http://en.wikipedia.org/wiki/Serialization – NPE

+5

là bạn yêu cầu _why tôi sẽ cần Pickle cho serialization trong Python? _ Hay đúng hơn là _what (mục đích của) serialization sau khi tất cả? – moooeeeep

Trả lời

78

Pickling là một cách để chuyển đổi một đối tượng python (danh sách, dict, vv) thành một dòng ký tự. Ý tưởng là luồng ký tự này chứa tất cả các thông tin cần thiết để xây dựng lại đối tượng trong một kịch bản lệnh python khác.

Đối với nơi thông tin được lưu trữ ngâm, thường người ta sẽ làm:

with open('filename', 'wb') as f: 
    var = {1 : 'a' , 2 : 'b'} 
    pickle.dump(var, f) 

Điều đó sẽ lưu trữ các phiên bản ngâm của var dict của chúng tôi trong file 'filename'. Sau đó, trong kịch bản khác, bạn có thể tải từ tập tin này vào một biến và từ điển sẽ được tái tạo:

with open('filename','rb') as f: 
    var = pickle.load(f) 

Một sử dụng cho tẩy là nếu bạn cần để truyền tải từ điển này qua mạng (có lẽ với ổ cắm hay một cái gì đó .) Trước tiên, bạn cần phải chuyển đổi nó thành một dòng ký tự, sau đó bạn có thể gửi nó qua một kết nối socket.

Ngoài ra, không có "nén" để nói ở đây ... nó chỉ là một cách để chuyển đổi từ một đại diện (trong RAM) sang một đại diện khác (trong "văn bản").

About.com có ​​phần giới thiệu đẹp về tẩy trắng here.

+2

thường là người ta sẽ làm 'với mở ('tên tập tin') là f: ...' – moooeeeep

+0

ah có ... đó là khả năng chống lỗi hơn. Cảm ơn. – austin1howard

+3

Ngoài ra, bạn sẽ cần phải làm 'với mở (tên tệp, 'wb') là f: ...' hoặc bạn sẽ không thể ghi vào tệp. –

29

Việc tẩy là hoàn toàn cần thiết cho tính toán phân tán và song song.

Giả sử bạn muốn làm giảm bản đồ song song với multiprocessing (hoặc qua các nút cụm với pyina), thì bạn cần đảm bảo chức năng bạn muốn ánh xạ trên các tài nguyên song song sẽ được chọn. Nếu nó không được chọn, bạn không thể gửi nó đến các tài nguyên khác trên một quá trình khác, máy tính, v.v. Ngoài ra, hãy xem here để có ví dụ điển hình.

Để làm điều này, tôi sử dụng dill, có thể tuần tự hóa hầu như mọi thứ trong python. Thì là cũng có some good tools để giúp bạn hiểu những gì đang gây ra sự thất bại của bạn khi mã của bạn không thành công.

Và, có, mọi người sử dụng chọn để lưu trạng thái của phép tính hoặc phiên ipython của bạn hoặc bất kỳ thứ gì. Bạn cũng có thể mở rộng Pickler của Pickler và UnPickler để nén với bz2 hoặc gzip nếu bạn muốn.

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