Error UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte 0xff en la posición 0: byte de inicio no válido

Resuelto pie asked hace 7 años • 20 respuestas

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

Se produjo un error al compilar "process.py" en el sitio anterior.

python tools/process.py --input_dir data --operation resize --output_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (most recent call last):
  File "tools/process.py", line 235, in <module>
    main()
  File "tools/process.py", line 167, in main
    src = load(src_path)
  File "tools/process.py", line 113, in load
    contents = open(path).read()
  File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

¿Cuál es la causa del error? La versión de Python es 3.5.2.

pie avatar Feb 20 '17 15:02 pie
Aceptado

Python intenta convertir una matriz de bytes ( bytesque se supone que es una cadena codificada en utf-8) en una cadena Unicode ( str). Este proceso, por supuesto, es una decodificación según las reglas de utf-8. Cuando intenta esto, encuentra una secuencia de bytes que no está permitida en cadenas codificadas en utf-8 (es decir, este 0xff en la posición 0).

Como no proporcionó ningún código que pudiéramos ver, solo pudimos adivinar el resto.

Del seguimiento de la pila podemos suponer que la acción desencadenante fue la lectura de un archivo ( contents = open(path).read()). Propongo recodificar esto de una manera como esta:

with open(path, 'rb') as f:
  contents = f.read()

Que ben el especificador de modo en los open()estados que el archivo será tratado como binario, por lo que contentsseguirá siendo un bytes. No se realizará ningún intento de decodificación de esta manera.

Alfe avatar Feb 20 '2017 09:02 Alfe

Utilice esta solución, eliminará (ignorará) los caracteres y devolverá la cadena sin ellos. Utilice esto sólo si lo que necesita es quitarlos, no convertirlos.

with open(path, encoding="utf8", errors='ignore') as f:

Al usarlo, errors='ignore' simplemente perderás algunos personajes. pero si no te importan, ya que parecen ser caracteres adicionales que se originan por el mal formato y programación de los clientes que se conectan a mi servidor de socket. Entonces es una solución directa y fácil. referencia

Nitish Kumar Pal avatar Feb 01 '2018 05:02 Nitish Kumar Pal