2014-07-01 17 views
6

Tôi muốn để mã hóa những thứ mẫu hình dưới đây:Làm thế nào để mã hóa từ điển python?

name = "Myname" 
status = "married" 
sex = "Male" 
color = {'eyeColor' : 'brown', 'hairColor' : 'golden', 'skinColor' : 'white'} 

Tôi đang sử dụng chương trình mã hóa base64 và sử dụng cú pháp như <field-name>.encode('base64','strict') nơi field-name gồm nêu trên tên fields-, tình trạng và vân vân.

Mọi thứ ngoại trừ từ điển "màu" đang được mã hóa. tôi nhận được lỗi tại color.encode('base64','strict')

Các lỗi được như hình dưới đây:

Traceback (most recent call last): 
    color.encode('base64','strict') 
AttributeError: 'CaseInsensitiveDict' object has no attribute 'encode' 

Tôi nghĩ rằng mã hóa phương pháp không được appicable vào từ điển. Làm cách nào để mã hóa từ điển hoàn chỉnh cùng một lúc? Có phương án nào khác với phương thức encode áp dụng cho từ điển không?

+0

Từ điển hoàn chỉnh phải được mã hóa thành định dạng mã hóa base64. – v1h5

+0

Một cách khác là vào từ điển, tìm nạp các trường, mã hóa chúng riêng lẻ và lưu trữ chúng. Nhưng tôi đang tìm kiếm giải pháp thay thế phức tạp miễn phí. – v1h5

Trả lời

12

encode là phương pháp mà các phiên bản chuỗi có, không phải từ điển. Bạn không thể đơn giản sử dụng nó với mọi trường hợp của mọi đối tượng. Vì vậy, giải pháp đơn giản nhất sẽ được gọi str trên từ điển đầu tiên:

str(color).encode('base64','strict') 

Tuy nhiên, đây là ít thẳng về phía trước khi bạn muốn giải mã chuỗi của bạn và nhận được từ điển mà trở lại. Python có một mô-đun để làm điều đó, nó được gọi là pickle. Pickle có thể giúp bạn có được một chuỗi đại diện của bất kỳ đối tượng, mà sau đó bạn có thể mã hóa thành base64. Sau khi bạn giải mã nó trở lại, bạn cũng có thể bỏ chọn nó để lấy lại bản gốc.

b64_color = pickle.dumps(color).encode('base64', 'strict') 
color = pickle.loads(b64_color.decode('base64', 'strict')) 

Các lựa chọn thay thế cho dưa + base64 có thể là json.

+0

Tuyệt vời. Thanks @Korem. Nó hoạt động như một viên ngọc. +1 như tôi đã biết về chủ đề mới "dưa" – v1h5

+0

Điều gì sẽ là một cách ưa thích thậm chí tiêu thụ ít bộ nhớ hơn? Các tùy chọn đầu tiên của bạn hoặc tẩy? – v1h5

+0

@ v1h5 cho mục đích gì? Tôi sẽ đi với 'pickle' hoặc' cPickle' – Korem

-1
# Something like this works on Python 2.7.12 
from base64 import b64decode 
color = {'eyeColor' : 'brown', 'hairColor' : 'golden', 'skinColor' : 'white'} 
encoded_color = str(color).encode('base64','strict') 
print(encoded_color) 

decoded_color = b64decode(encoded_color) 
print(decoded_color) 
Các vấn đề liên quan