2014-07-01 21 views
6

chcę kodować materiał próbka poniżej:Jak kodować słownik Pythona?

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

używam schematu kodowania base64 i stosować składnię jak <field-name>.encode('base64','strict') gdzie field-name składa się z wyżej wymienionych Fields nazwę, status i tak dalej.

Wszystko oprócz słownika "kolor" zostaje zakodowane. otrzymuję błąd w color.encode('base64','strict')

Błąd jest jak pokazano poniżej:

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

myślę metoda kodowania nie jest appicable na słownika. Jak mogę zakodować cały słownik naraz? Czy istnieje alternatywa dla metody encode, która ma zastosowanie do słowników?

+0

Kompletny słownik powinien być zakodowany w formacie kodowania base64. – v1h5

+0

Jedną z alternatyw jest wejście do słownika, pobieranie pól, kodowanie ich pojedynczo i przechowywanie. Ale szukam łatwej alternatywy. – v1h5

Odpowiedz

12

encode to metoda, która ma ciągi znaków, a nie słowniki. Nie można go po prostu użyć przy każdym wystąpieniu każdego obiektu. więc najprostszym rozwiązaniem byłoby zadzwonić str w słowniku pierwsze:

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

Jest to jednak mniej prosto do przodu, kiedy tylko chcesz zdekodować swój ciąg i uzyskać słownika powrotem. Python ma moduł do tego, nazywa się pickle. Pickle może pomóc w uzyskaniu reprezentacji ciągów dowolnego obiektu, którą następnie można zakodować na base64. Po odszyfrowaniu go możesz również go usunąć, aby odzyskać oryginalną instancję.

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

Inne alternatywy marynowane + base64 może być json.

+0

Cudowny. Dzięki @Korem. Działa jak klejnot. +1, ponieważ dowiedziałem się o nowym temacie "pikle" – v1h5

+0

Jaki byłby preferowany sposób, który pochłania nawet mniej pamięci? Pierwsza opcja twojej lub piklowania? – v1h5

+0

@ v1h5 w jakim celu? Poszedłbym z 'pickle' lub' 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)