2012-03-02 3 views
5

Tengo un programa de Python 2.7 que escribe datos de varias aplicaciones externas. Continuamente me muerden las excepciones cuando escribo en un archivo hasta que agregue .decode(errors="ignore") a la cadena que se está escribiendo. (FWIW, abrir el archivo como mode="wb" no soluciona esto.)¿Puedo hacer decodificar (errors = "ignore") el valor predeterminado para todas las cadenas en un programa Python 2.7?

¿Hay alguna manera de decir "ignorar los errores de codificación en todas las cadenas en este ámbito"?

Respuesta

5

No puede redefinir métodos en tipos incorporados, y no puede cambiar el valor predeterminado del parámetro errors a str.decode(). Sin embargo, hay otras maneras de lograr el comportamiento deseado.

La manera un poco más bonitas:decode() definir sus propias funciones:

def decode(s, encoding="ascii", errors="ignore"): 
    return s.decode(encoding=encoding, errors=errors) 

Ahora, tendrá que llamar decode(s) en lugar de s.decode(), pero eso no no está tan mal, ¿verdad?

El truco: No se puede cambiar el valor por defecto del parámetro errors, pero puede sobrescribir lo que el controlador para el defecto errors="strict" hace:

import codecs 
def strict_handler(exception): 
    return u"", exception.end 
codecs.register_error("strict", strict_handler) 

Esto va a cambiar esencialmente el comportamiento de errors="strict" al comportamiento estándar "ignore". Tenga en cuenta que se tratará de un cambio global que afectará a todos los módulos que importe.

Recomiendo ninguna de estas dos formas. La verdadera solución es obtener sus codificaciones correctas. (Soy muy consciente de que esto no siempre es posible.)

1

No estoy seguro de lo que su configuración es exactamente, pero se puede derivar una clase de str y anular su método de decodificación:

class easystr(str): 
    def decode(self): 
     return str.decode(self, errors="ignore") 

Si a continuación, convertir todas las cadenas entrantes a easystr, errores será ignorada:

line = easystr(input.readline()) 

dicho esto, decodificar una cadena convierte en unicode, que nunca debe ser con pérdida. ¿Podría averiguar qué codificación están usando sus cadenas y dar como argumento encoding al decode? Esa sería una mejor solución (y aún así puedes convertirla en la predeterminada de la manera anterior).

Otra cosa que debes intentar es leer tus datos de manera diferente. Hacerlo de esta manera y los errores de decodificación bien pueden desaparecer:

import codecs 
input = codecs.open(filename, "r", encoding="latin-1") # or whatever 
Cuestiones relacionadas