2015-10-25 12 views
5

Ich versuche, eine Zeichenfolge in Google Geocoding API zu verwenden. Ich habe viele Threads überprüft, aber ich habe immer noch ein Problem und ich verstehe nicht, wie man es löst.Wie Akzent in Python 3.5 entfernen und eine Zeichenkette mit unicodedata oder anderen Lösungen erhalten?

Ich brauche Adresse1, um eine Zeichenfolge ohne Sonderzeichen zu sein. Adresse1 ist zum Beispiel: "32 rue d'Athènes Paris France".

addresse1= collect.replace(' ','+').replace('\n','') 
addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore') 

ich hier ohne Akzent einen String bekam ... Ho nein ... Es ist kein String, sondern ein Byte. So getan, was ich habe, was vorgeschlagen wurde und ‚decode:

addresse1=addresse1.decode('utf-8') 

Aber dann addresse1 ist genau das gleiche, als am Anfang ... Was muss ich tun? Was mache ich falsch? Oder was ich mit Unicode nicht verstehe? Oder gibt es eine bessere Lösung?

Danke,

Stéphane.

+0

[Pragmatische Unicode] (http://nedbatchelder.com/text/unipain/ unipain.html # 1) und [Das absolute Minimum, das jeder Softwareentwickler unbedingt, unbedingt über Unicode und Zeichensätze wissen muß] (http://www.joelonsoftware.com/articles/Unicode.html) kann nützlich sein, um das Verständnis zu verstehen was "encode" und "decode" tun (und warum sie nicht das sind, was Sie hier wollen). Im Allgemeinen vorausgesetzt, Sie verwenden eine Codierung, die jedes Zeichen in Ihrer Zeichenfolge darstellen kann, sollten Sie * erwarten * 'mystring.encode (my_encoding) .decode (my_encoding) == mystring'. – lvc

+0

Die bessere Lösung besteht darin, Ihr Programm so zu korrigieren, dass es Unicode korrekt verarbeitet. Daten wegwerfen, mit denen man nicht umgehen kann, ist nie eine gute Lösung. :) So _please_ werfen Sie einen guten Blick auf lvc Links. –

Antwort

13

unidecode

3>> unidecode.unidecode("32 rue d'Athènes Paris France") 
"32 rue d'Athenes Paris France" 
0

Sie können die translate()-Methode von Python verwenden. Hier ist ein Beispiel von tutorialspoint.com kopiert:

#!/usr/bin/python 

from string import maketrans # Required to call maketrans function. 

intab = "aeiou" 
outtab = "12345" 
trantab = maketrans(intab, outtab) 

str = "this is string example....wow!!!"; 
print str.translate(trantab) 

Diese Ausgänge:

th3s 3s str3ng 2x1mpl2 .... w4w !!!

So können Sie festlegen, welche Zeichen Sie mehr ersetzen leichter als mit replace()

+0

Dies funktioniert nicht, wenn ein Akzentzeichen in der Registerkarte vorhanden ist. Versuchen Sie es mit intab = "äeiou". – Raja

1

addresse1 = unicodedata.normalize ('NFKD', addresse1) .encode ('utf-8', 'ignorieren')

Sie wahrscheinlichgemeint, um Nicht-ASCII-Zeichen zu entfernen. UTF-8 enthält alle Zeichen, so dass die Kodierung davon nicht entfernt wird, und ein Kodier-Dekodier-Zyklus mit ihm ist ein No-Op.

Gibt es eine bessere Lösung?

Es hängt davon ab, was Sie zu tun versuchen.

Wenn Sie nur diakritische Zeichen entfernen möchten, und nicht alle anderen Nicht-ASCII-Zeichen verlieren, könnten Sie unicodedata.category für jedes Zeichen nach NFKD normalisiere lesen und jene der Klasse M.

entfernen Wenn Sie transkribieren wollen ASCII, das zu einer sprachspezifischen Frage wird, die eine benutzerdefinierte Ersetzung erfordert (z. B. in Deutsch ö wird oe, aber nicht auf Schwedisch).

Wenn Sie nur eine Zeichenfolge in ASCII fudgen möchten, weil das Nicht-ASCII-Zeichen zum Brechen von Code führt, ist es natürlich besser, diesen Code so zu korrigieren, dass er mit allen Unicode-Zeichen ordnungsgemäß funktioniert . Der Buchstabe è ist in ASCII nicht codierbar, aber auch nicht 99.9989% aller Charaktere, so dass es kaum "besonders" ist. Code, der nur ASCII unterstützt, ist lahm.

Die Google Geocoding-API kann sehr gut mit Unicode arbeiten, daher gibt es keinen offensichtlichen Grund, warum Sie dies tun sollten.

ETA:

url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ... 

Ah, Sie müssen alle Daten URL-kodieren Sie in eine URL zu injizieren. Das ist nicht nur für Unicode - das obige wird für viele ASCII Interpunktionszeichen auch brechen. Verwenden Sie urllib.quote einen einzelnen String zu kodieren, oder urllib.encode, um mehrere Parameter zu konvertieren:

params = dict(
    address=address1.encode('utf-8'), 
    key=googlekey 
) 
url2 = '...?' + urllib.urlencode(params) 

(in Python 3 ist es urllib.parse.quote und urllib.parse.encode und sie automatisch wählen UTF-8, so dass Sie nicht manuell dort codieren müssen.)

json.loads liest Byte-Strings, so dass Sie sicher sein sollten, die UTF-8-Decodierung wegzulassen. Auf jeden Fall wird json.load direkt aus einer Datei-ähnliches Objekt lesen, so sollten Sie die Daten nicht in einen String laden müssen überhaupt:

data3 = json.load(urllib.request.urlopen(url2)) 
+0

OK. Vielleicht liegt es daran, dass ich mit meinem Code in die falsche Richtung gehe: url2 = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 + '& key =' + googlekey \t data2 = urllib.request.urlopen (url2) .read() .decodieren ('utf-8') \t data3 = json.loads (data2) – Sulot

+0

@Sulot: [aktualisierte Antwort mit Antwort] – bobince