Mögliche Duplizieren in ASCII:
How to get string Objects instead Unicode ones from JSON in Python?Python: Konvertieren komplexe Wörterbuch von Strings von Unicode
Ich habe viel Input wie Multi-Level-Wörterbücher von JSON-API-Aufrufe analysiert. Die Strings sind alle in Unicode, was bedeutet, dass es viele u'stuff like this'
gibt. Ich verwende jq, um mit den Ergebnissen herumzuspielen und diese Ergebnisse in ASCII zu konvertieren.
Ich weiß, dass ich eine Funktion schreiben, kann es einfach so konvertieren:
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
Ist das auch richtig? Nicht sicher. Das möchte ich dich aber nicht fragen.
Was ich fragen ist, das ist eine typische Brute-Force-Lösung für das Problem. Es muss einen besseren Weg geben. Ein mehr pythonischer Weg. Ich bin kein Experte für Algorithmen, aber dieser sieht auch nicht besonders schnell aus.
Also gibt es einen besseren Weg? Oder wenn nicht, kann diese Funktion verbessert werden ...?
Post-Antwort bearbeiten
Mark Amery's answer korrekt ist, aber ich möchte eine modifizierte Version davon schreiben. Seine Funktion ist auf Python 2.7+ und ich bin auf 2.6, so hatte es zu konvertieren:
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
Wenn Sie in Python 2 sind, dann ist Unicode keine Instanz von 'str', sondern von' unicode'. Auch bei der 'list'- und' dict'-Verarbeitung machen Sie es falsch. – agf
Für den Listenfall möchten Sie möglicherweise die Behandlung von Iterablen berücksichtigen. In jedem Fall können Sie den Zweig der if-Anweisung durch 'ret = [convert (x) for x in input]' ersetzen. Überprüfen Sie auch Ihren Wörterbuchfall. "ret" enthält nur den letzten Schlüssel, in den das Wörterbuch konvertiert. –
@MichaelMior Das Problem bei der Behandlung von iterierbaren Elementen ist, dass nicht alle iterierbaren Elemente listartig sind. Zum Beispiel sind Dictionaries iterierbar, aber 'ret = [convert (x) für x input]' ist eindeutig nicht das, was wir wollen, wenn 'input' ein Dictionary ist. –