2015-10-25 33 views
5

Sto cercando di ottenere una stringa da utilizzare in gooc geocoding di google. Ho controllato un sacco di thread ma sto ancora affrontando un problema e non capisco come risolverlo.Come rimuovere l'accento in Python 3.5 e ottenere una stringa con unicodedata o altre soluzioni?

Ho bisogno di addresse1 di essere una stringa senza caratteri speciali. Addresse1 è ad esempio: "32 rue d'Athènes Paris France".

qui ho ottenuto una stringa senza accento ... no no ... non è una stringa ma un byte. Così Io ho fatto ciò che è stato suggerito e 'di decodifica:

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

Ma poi addresse1 è esattamente la stessa rispetto agli inizi ... Che cosa devo fare? Che cosa sto facendo di sbagliato? O cosa non capisco con unicode? O c'è una soluzione migliore?

Grazie,

Stéphane.

+0

[unicode Pragmatic] (http://nedbatchelder.com/text/unipain/ unipain.html # 1) e [Il minimo assoluto di ogni sviluppatore di software assolutamente, positivamente deve conoscere l'Unicode e i set di caratteri] (http://www.joelonsoftware.com/articles/Unicode.html) può essere utile leggere in termini di comprensione cosa 'encode' e' decode' fanno (e perché non sono quello che vuoi qui). In generale, supponendo che tu stia usando una codifica che può rappresentare ogni carattere nella tua stringa, dovresti * aspettarti * 'mystring.encode (my_encoding) .decode (my_encoding) == mystring'. – lvc

+0

La soluzione migliore è quella di correggere il programma in modo che gestisca correttamente Unicode. Gettare via i dati che non sai come gestire non è mai una buona soluzione. :) Quindi, per favore, dai un'occhiata ai link di lvc. –

risposta

13

unidecode

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

È possibile utilizzare il metodo translate() da python. Ecco un esempio copiato da tutorialspoint.com:

#!/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) 

Questo uscite:

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

Così si può definire ciò che i personaggi si desidera sostituire più facilmente che con replace()

+0

Questo non funzionerà se c'è un carattere di accento in intab. Prova con intab = "äeiou". – Raja

1

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

Probabilmente si intende .encode('ascii', 'ignore'), per rimuovere caratteri non ASCII. UTF-8 contiene tutti i caratteri, quindi la codifica non viene eliminata e un ciclo di codifica e decodifica con esso non è operativo.

c'è una soluzione migliore?

Dipende da ciò che si sta tentando di fare.

Se si desidera rimuovere i segni diacritici e non perdere tutti gli altri caratteri non-ASCII, si poteva leggere unicodedata.category per ogni personaggio dopo NFKD-normalizzante e rimuovere quelli della categoria M.

Se vuoi traslitterare a ASCII che diventa una domanda specifica della lingua che richiede sostituzioni personalizzate (ad esempio in tedesco ö diventa oe, ma non in svedese).

Se si desidera fondere una stringa in ASCII perché i caratteri non ASCII al suo interno causano la rottura di un codice, è ovviamente molto meglio correggere quel codice affinché funzioni correttamente con tutti i caratteri Unicode piuttosto che manipolare dati buoni . La lettera è non è codificabile in ASCII, ma nemmeno 99.Il 9989% di tutti i personaggi, quindi difficilmente lo rende "speciale". Il codice che supporta solo ASCII è zoppo.

L'API di geocoding di Google può funzionare perfettamente con Unicode, quindi non vi è alcun motivo ovvio per cui sia necessario eseguire questa operazione.

ETA:

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

Ah, è necessario url-encode dei dati che si inietta in un URL. Questo non è solo per Unicode - il suddetto si romperà anche per molti simboli di punteggiatura ASCII. Utilizzare urllib.quote per codificare una singola stringa, o urllib.encode per convertire più parametri:

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

(in Python 3 E 'urllib.parse.quote e urllib.parse.encode e scelgono automaticamente UTF-8 in modo non c'è bisogno di codificare manualmente lì.)

data2 = urllib.request.urlopen(url2).read().decode('utf-8') 
data3=json.loads(data2) 

json.loads legge le stringhe di byte, pertanto è consigliabile omettere la decodifica UTF-8. In ogni caso json.load leggerà direttamente da un oggetto simile a file, quindi non si dovrebbe avere per caricare i dati in una stringa a tutti:

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

OK. Forse è perché sto andando nella direzione sbagliata con il mio codice: url2 = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 + '& key =' + googlekey \t data2 = urllib.request.urlopen (url2) .read(). decode ('utf-8') \t data3 = json.loads (data2) – Sulot

+0

@Sulot: [risposta aggiornata con risposta] – bobince