53 votos

"Error de Unicode "unicodeescape" codec no puede decodificar bytes... No se pueden abrir archivos de texto en Python 3

Estoy usando Python 3.1, en una máquina con Windows 7. El ruso es el idioma por defecto del sistema, y utf-8 es la codificación por defecto.

Mirando la respuesta a un pregunta anterior He intentado usar el módulo "codecs" para tener un poco de suerte. Aquí hay algunos ejemplos:

>>> g = codecs.open("C:\Users\Eric\Desktop\beeline.txt", "r", encoding="utf-8")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \UXXXXXXXX escape (<pyshell#39>, line 1)
>>> g = codecs.open("C:\Users\Eric\Desktop\Site.txt", "r", encoding="utf-8")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \UXXXXXXXX escape (<pyshell#40>, line 1)
>>> g = codecs.open("C:\Python31\Notes.txt", "r", encoding="utf-8")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 11-12: malformed \N character escape (<pyshell#41>, line 1)
>>> g = codecs.open("C:\Users\Eric\Desktop\Site.txt", "r", encoding="utf-8")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \UXXXXXXXX escape (<pyshell#44>, line 1)

Mi última idea fue, pensé que podría ser el hecho de que Windows "traduce" algunas carpetas, como la de "usuarios", al ruso (aunque escribiendo "usuarios" sigue siendo la ruta correcta), así que lo intenté en la carpeta Python31. Aun así, no hubo suerte. ¿Alguna idea?

120voto

Martin v. Löwis Puntos 61768

El problema está en la cadena

"C:\Users\Eric\Desktop\beeline.txt"

Aquí, \U inicia un escape Unicode de ocho caracteres, como ' \U00014321 `. En tu código, el escape va seguido del carácter 's', que no es válido.

Es necesario duplicar todas las barras invertidas o anteponer a la cadena el prefijo r (para producir una cadena cruda).

29voto

Julio Cesar Puntos 325

Típico error en Windows porque el directorio de usuario por defecto es C:\user\<your_user> por lo que cuando se quiere pasar esta ruta como un argumento de cadena en una función de Python, se obtiene un error Unicode, sólo porque el \u es un escape Unicode. Si los siguientes 8 caracteres después del \u no son numéricos se produce un error.

Para solucionarlo, basta con duplicar las barras invertidas: C:\\user\\<\your_user>... Esto asegurará que Python trate las barras invertidas simples como barras invertidas simples.

27voto

Fiddy Bux Puntos 465

Prefijar con 'r' funciona muy bien, pero necesita estar en la sintaxis correcta. Por ejemplo:

passwordFile = open(r'''C:\Users\Bob\SecretPasswordFile.txt''')

No es necesario \\ aquí - mantiene la legibilidad y funciona bien.

9voto

Matthew Cox Puntos 1116

Con Python 3 tuve este problema:

 self.path = 'T:\PythonScripts\Projects\Utilities'

produjo este error:

 self.path = 'T:\PythonScripts\Projects\Utilities'
            ^
 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
 position 25-26: truncated \UXXXXXXXX escape

el arreglo que ha funcionado es:

 self.path = r'T:\PythonScripts\Projects\Utilities'

Parece que el ' \U ' estaba produciendo un error y la 'r' que precede a la cadena desactiva el escape de ocho caracteres Unicode (para una cadena sin procesar) que estaba fallando. (Esto es una simplificación excesiva, pero funciona si no te importa unicode)

Espero que esto ayude a alguien

7voto

O bien, puede sustituir '\' por '/' en la ruta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X