Una possibilità potrebbe essere (supponendo Python 2):
def encode_dict(d, codec='utf8'):
ks = d.keys()
for k in ks:
val = d.pop(k)
if isinstance(val, unicode):
val = val.encode(codec)
elif isinstance(val, dict):
val = encode_dict(val, codec)
if isinstance(k, unicode):
k = k.encode(codec)
d[k] = val
return d
top_d = encode_dict(top_d)
È necessario rimuovere (tramite .pop
) ciascuna chiave Unicode , quindi reinserirla (con la codifica appena codificata val
) dopo la codifica k
in una stringa di byte, altrimenti (poiché, per le chiavi costituite solo da caratteri ASCII, è il caso di k == k.encode('utf-8')
), la chiave Unicode rimarrebbe. Provalo usando d.get
invece di d.pop
- non fa quello che chiedi.
Se in realtà lo ha bisogno di quello che chiedi è in realtà piuttosto discutibile; se tutte le stringhe Unicode in d
(e diciture incorporate) sono costituite solo da caratteri ASCII, quindi d == encode_dict(d)
. Tuttavia, i moduli "stringificati" apparirebbero in effetti esteticamente diversi, e immagino che potrebbe essere quello che cerchi.
fonte
2015-01-11 22:53:42
'u' denota la sua stringa unicode. vuoi rimuoverlo ?? – Hackaholic
Non penso che tu possa. Indica che la stringa è rappresentata come unicode, quindi non fa parte della stringa. Btw in 'python 3.x' c'è il supporto Unicode di default, quindi il prefisso' u' non è usato. – VHarisop
Lo metto a confronto con un altro dato che non ha u 'in esso. – user3738426