2011-09-13 25 views
8

Estoy tratando de usar string.replace('’','') para reemplazar el temible carácter de comillas simples:' (aka \ xe2 aka # 8217). Pero cuando corro esa línea de código, me sale este error:Reemplazar una comilla única extraña (') con una cadena en blanco en Python

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

EDITAR: Me sale este error al intentar reemplazar los caracteres en un archivo CSV obtenido de forma remota.

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

Incluso después de ejecutar el código anterior, el carácter no deseado todavía existe en el resultado de la impresión. Probé las sugerencias en las respuestas a continuación también. Estoy bastante seguro de que es un problema de codificación, pero no sé cómo solucionarlo, por lo que cualquier ayuda es muy apreciada.

+0

Realmente aprecio los intentos de responder esto, pero las respuestas no solucionaron el problema. He editado mi pregunta con más detalles y códigos para ayudar con suerte. – Gady

+0

¿Has probado 'latin-1'? – agf

+0

Sí, lo hice. Mismo resultado. – Gady

Respuesta

11

El problema aquí es con la codificación del archivo descargado (aa_meetings.csv). El servidor no declara una codificación en sus encabezados HTTP, pero el único octeto que no es ASCII en el archivo tiene el valor 0x92. Usted dice que esto se supone que es "el temible carácter de comillas simples", por lo tanto, la codificación del archivo es windows-1252. Pero está intentando buscar y reemplazar la codificación UTF-8 de U + 2019, es decir, '\xe2\x80\x99', que no es lo que está en el archivo.

la fijación de este es tan simple como añadir las llamadas apropiadas a encode y 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")) 

por "ASCII" me refiero a "la codificación de caracteres que asigna los octetos individuales con valores de 0x00 a través de 0x7F directamente a T +0000 a U + 007F, y no define el significado de octetos con valores de 0x80 a 0xFF ".

8

Tienes que declare the encoding del archivo de origen. poner esto como una de las dos primeras líneas de su código:

# encoding: utf-8 

Si está utilizando una codificación que no sea UTF-8 (por ejemplo Latin-1), que tiene que poner en su lugar.

+0

Consulte la edición de mi pregunta. – Gady

2

Puede hacer string.replace('\xe2', "'") para reemplazarlos con la comilla simple normal.

+0

Consulte la edición de mi pregunta. – Gady

2

Este archivo está codificado en Windows-1252. El apóstrofo U+2019 codifica a \x92 en esta codificación. Lo más apropiado es decodificar el archivo a Unicode para el procesamiento:

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 

El problema era que estaba buscando una codificación UTF-8 U+2019, es decir \xe2\x80\x99, que no estaba en el archivo. La conversión a Unicode resuelve esto.

El uso de literales unicode como el que tengo aquí es una manera fácil de evitar este error. Sin embargo, se puede codificar el carácter directamente si se escribe como u'’':

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

Obtuve dichos errores Non-ASCII character '\xe2' repetidamente con mis scripts Python, a pesar de reemplazar las comillas simples. Resulta que el carácter no ASCII realmente era un doble en el tablero (-). Lo reemplacé con una doble línea regular (-) y eso lo solucionó.[Ambos se verán igual en la mayoría de las pantallas. Dependiendo de la configuración del tipo de letra, la problemática podría ser un poco más largo]

Para cualquiera encontrarse con el mismo problema en sus scripts de Python (en sus líneas de código, no en los datos cargados por su guión):.

Opción 1: deshacerse del carácter problemático

  • Vuelva a escribir la línea con la mano. (Para asegurarse de que no copió y pegó el carácter problemático por error)
  • Tenga en cuenta que al comentar la salida de línea no funcionará.
  • Compruebe si el personaje problemático realmente es el que usted piensa.

Opción 2: cambiar la codificación

Declarar una codificación al principio de la secuencia de comandos, como Roberto señaló:

# encoding: utf-8 

Espero que esto ayude a alguien.

Cuestiones relacionadas