Error UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte 0xff en la posición 0: byte de inicio no válido
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.
Python intenta convertir una matriz de bytes ( bytes
que 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 b
en el especificador de modo en los open()
estados que el archivo será tratado como binario, por lo que contents
seguirá siendo un bytes
. No se realizará ningún intento de decodificación de esta manera.
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