Eventuali duplicati:
How to get string Objects instead Unicode ones from JSON in Python?Python: Convertire complesso dizionario di stringhe da Unicode a ASCII
Ho un sacco di input come dizionari multi-livello analizzati da chiamate API JSON. Le stringhe sono tutte in unicode, il che significa che c'è un gran numero di u'stuff like this'
. Sto usando jq per giocare con i risultati e ho bisogno di convertire questi risultati in ASCII.
So che posso scrivere una funzione per convertire proprio in quel modo:
def convert(input):
if isinstance(input, dict):
ret = {}
for stuff in input:
ret = convert(stuff)
elif isinstance(input, list):
ret = []
for i in range(len(input))
ret = convert(input[i])
elif isinstance(input, str):
ret = input.encode('ascii')
elif :
ret = input
return ret
Questo è anche corretto? Non sono sicuro. Non è quello che voglio chiederti però.
Quello che sto chiedendo è, questa è una tipica soluzione a forza bruta del problema. Ci deve essere un modo migliore. Un modo più pitonico. Non sono esperto di algoritmi, ma anche questo non sembra particolarmente veloce.
Quindi c'è un modo migliore? O se no, questa funzione può essere migliorata ...?
Post-risposta modificare
Mark Amery's answer è corretto ma vorrei pubblicare una versione modificata di esso. La sua funzione di opere su Python 2.7+ e sono il 2.6 così ha dovuto convertirlo:
def convert(input):
if isinstance(input, dict):
return dict((convert(key), convert(value)) for key, value in input.iteritems())
elif isinstance(input, list):
return [convert(element) for element in input]
elif isinstance(input, unicode):
return input.encode('utf-8')
else:
return input
Se si utilizza Python 2, Unicode non è un'istanza di 'str', ma di 'unicode'. Inoltre, nell'elaborazione 'list' e' dict', stai sbagliando. – agf
Per l'elenco dei casi, potrebbe essere opportuno prendere in considerazione la gestione di qualsiasi iterabile. In ogni caso, è possibile sostituire quel ramo dell'istruzione if con 'ret = [convert (x) per x in input]'. Inoltre, controlla il caso del dizionario. 'ret' conterrà solo l'ultima chiave convertita nel dizionario. –
@MichaelMior Il problema con la gestione di qualsiasi iterabile nel modo in cui hai descritto è che non tutti i iterabili sono simili a elenchi. Ad esempio, i dizionari sono iterabili, ma 'ret = [convert (x) per x in input]' non è chiaramente quello che vogliamo se 'input' è un dizionario. –