2011-09-13 17 views
8

Sto tentando di utilizzare string.replace('’','') per sostituire il temuto carattere a virgoletta singola:' (aka \ xe2 alias # 8217). Ma quando si esegue questa riga di codice, ottengo questo errore:Sostituzione di una strana virgoletta singola (') con una stringa vuota in Python

SyntaxError: Non-ASCII character '\xe2' in file 

EDIT: Ottengo questo errore quando si cerca di sostituire i caratteri in un file CSV ottenuto da remoto.

# encoding: utf-8 

import urllib2 

# read raw CSV data from URL 
url = urllib2.urlopen('http://www.aaphoenix.org/meetings/aa_meetings.csv') 
raw = url.read() 

# replace bad characters 
raw = raw.replace('’', "") 

print(raw) 

Anche dopo l'esecuzione del codice precedente, il carattere indesiderato esiste ancora nel risultato di stampa. Ho provato anche i suggerimenti nelle risposte sottostanti. Abbastanza sicuro che sia un problema di codifica, ma non so come risolverlo, quindi ovviamente ogni aiuto è molto apprezzato.

+0

Apprezzo molto i tentativi di risposta, ma le risposte non hanno risolto il problema. Ho modificato la mia domanda con maggiori dettagli e codice per aiutare eventualmente. – Gady

+0

Hai provato 'latino-1'? – agf

+0

Sì, l'ho fatto. Stesso risultato – Gady

risposta

11

Il problema qui è con la codifica del file scaricato (aa_meetings.csv). Il server non dichiara una codifica nelle intestazioni HTTP, ma l'unico ottetto non-ASCII nel file ha il valore 0x92. Dici che questo dovrebbe essere "il temuto personaggio a virgoletta singola", quindi la codifica del file è windows-1252. Ma stai cercando di cercare e sostituire la codifica UTF-8 di U + 2019, ovvero '\xe2\x80\x99', che non è ciò che è nel file.

fissare questo è sufficiente aggiungere chiamate appropriate per encode e decode:

# encoding: utf-8 
import urllib2 

# read raw CSV data from URL 
url = urllib2.urlopen('http://www.aaphoenix.org/meetings/aa_meetings.csv') 
raw = url.read().decode('windows-1252') 

# replace bad characters 
raw = raw.replace(u'’', u"'") 

print(raw.encode("ascii")) 

da "ASCII" intendo "la codifica dei caratteri che mappa ottetti singoli con valori 0x00 attraverso 0x7F direttamente a U Da +0000 a U + 007F e non definisce il significato di ottetti con valori da 0x80 a 0xFF ".

8

Devi declare the encoding del file sorgente. mettere questa come una delle prime due righe di codice:

# encoding: utf-8 

Se si utilizza una codifica diversa da UTF-8 (per esempio Latin-1), devi mettere che, invece.

+0

Si prega di vedere la modifica alla mia domanda. – Gady

2

È possibile eseguire string.replace('\xe2', "'") per sostituirli con la normale quota singola.

+0

Si prega di vedere la modifica alla mia domanda. – Gady

2

Questo file è codificato in Windows-1252. L'apostrofo U+2019 codifica su \x92 in questa codifica. La cosa giusta è quello di decodificare il file in Unicode per l'elaborazione:

data = open('aa_meetings.csv').read() 
assert '\x92' in data 
chars = data.decode('cp1252') 
assert u'\u2019' in chars 
fixed = chars.replace(u'\u2019', '') 
assert u'\u2019' not in fixed 

Il problema era che stavi cercando una codifica UTF-8 U+2019, vale a dire \xe2\x80\x99, che non era nel file. La conversione in Unicode risolve questo problema.

L'utilizzo di valori letterali unicode come quello che ho qui è un modo semplice per evitare questo errore. Tuttavia, è possibile codificare il carattere direttamente se si scrive come u'’':

Python 2.7.1 
>>> u'’' 
u'\u2019' 
>>> '’' 
'\xe2\x80\x99' 
0

Stavo ricevendo tali errori Non-ASCII character '\xe2' ripetutamente con i miei script Python, nonostante la sostituzione delle virgolette singole. Si scopre il carattere non ASCII era in realtà un doppio trattino (-). L'ho sostituito con un doppio trattino regolare (-) e l'ho risolto.[Entrambi sembreranno uguali sulla maggior parte degli schermi. A seconda delle impostazioni dei caratteri, la problematica potrebbe apparire un po 'più a lungo]

Per chiunque incontrando lo stesso problema nella loro script Python (nelle loro linee di codice, non in dati caricati dallo script):.

Opzione 1: sbarazzarsi del carattere problematico

  • Re-tipo della linea a mano. (Per accertarsi di non aver copiato e incollato il carattere problematico per errore.)
  • Si noti che il commento sull'interruzione non funziona.
  • Controlla se il personaggio problematico è davvero quello che pensi.

Opzione 2: modificare la codifica

Dichiarare una codifica all'inizio dello script, come Roberto ha sottolineato:

# encoding: utf-8 

Spero che questo aiuti qualcuno.

Problemi correlati