2014-07-01 16 views
6

voglio codificare la roba di esempio riportato di seguito:Come codificare il dizionario Python?

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

Sto usando schema di codifica Base64 e utilizzati sintassi <field-name>.encode('base64','strict') dove field-name consiste di cui sopra nome settori-, lo stato e così via.

Tutto tranne il "colore" del dizionario viene codificato. ottengo errore alla color.encode('base64','strict')

L'errore è la seguente:

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

penso che il metodo di codifica non è Appicable sul dizionario. Come posso codificare il dizionario completo in una volta? Esiste un'alternativa al metodo encode applicabile ai dizionari?

+0

Il dizionario completo deve essere codificato in formato di codifica base64. – v1h5

+0

Un'alternativa è quella di entrare nel dizionario, recuperare i campi, codificarli singolarmente e memorizzarli. Ma sono alla ricerca di alternative gratuite senza problemi. – v1h5

risposta

12

encode è un metodo che ha istanze di stringa, non dizionari. Non puoi semplicemente usarlo con ogni istanza di ogni oggetto. Quindi la soluzione più semplice sarebbe quella di chiamare str il dizionario prima:

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

Tuttavia, questo è meno semplice quando ci si vuole decodificare la stringa e ottenere quel dizionario indietro. Python ha un modulo per farlo, si chiama pickle. Pickle può aiutarti a ottenere una rappresentazione di stringa di qualsiasi oggetto, che puoi quindi codificare in base64. Dopo averlo decodificato, puoi anche annullarlo per recuperare l'istanza originale.

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

Altre alternative a Pickle + base64 potrebbero essere json.

+0

Meraviglioso. Grazie @Korem. Funziona come una gemma. +1 come ho avuto modo di conoscere il nuovo argomento "pickle" – v1h5

+0

Quale sarebbe un modo preferito che consuma anche meno memoria? La prima opzione del tuo o del decapaggio ?? – v1h5

+0

@ v1h5 per quale scopo? Andrei con 'pickle' o' 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)