397 votes

"Unicode Error "unicodeescape" codec ne peut pas décoder les octets... Impossible d'ouvrir des fichiers texte en Python 3

J'utilise Python 3.1 sur une machine Windows 7. Le russe est la langue système par défaut, et utf-8 est l'encodage par défaut.

En regardant la réponse à une question précédente J'ai essayé d'utiliser le module "codecs" pour avoir un peu de chance. Voici quelques exemples :

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

Ma dernière idée était, je pensais que cela pouvait être le fait que Windows "traduit" quelques dossiers, comme le dossier "users", en russe (bien que taper "users" soit toujours le chemin correct), donc j'ai essayé dans le dossier Python31. Toujours pas de chance. Avez-vous des idées ?

8 votes

@Wahnfrieden Quoi ? Python 2 est appelé à disparaître dans le futur, il est donc logique d'utiliser Python 3, malgré son "manque" de "maturité".

0 votes

@Beau Martinez @orip Le manque (important) de soutien de la part des bibliothèques est une raison suffisante dans la plupart des cas. Avec les fonctionnalités de Py3k rétroportées vers Python 2.6 et 2.7, le portage vers 3.x plus tard sera de toute façon facile, et vous ne sacrifiez pas une quantité énorme de support de bibliothèques (ce qui est particulièrement dangereux si vous êtes un nouvel utilisateur et que vous ne pouvez pas anticiper correctement les bibliothèques que vous voulez).

0 votes

Les chaînes de caractères par défaut de Python 3 sont des chaînes de caractères unicode, donc \u est actif, et donc la chaîne littérale '\ufoo' soulève un SyntaxError . En Python 2, les chaînes de caractères par défaut ne sont pas des chaînes unicode, donc \u est inactif, et donc la chaîne littérale '\ufoo' ne soulève aucune erreur. En revanche, la chaîne littérale b'\ufoo' fait pas soulève une erreur quelconque en Python 3, et le littéral chaîne de caractères u'\ufoo' fait soulève une erreur dans Python 2.

905voto

Martin v. Löwis Points 61768

Le problème vient de la chaîne de caractères

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

Ici, \U sur "C:\Users ... commence un échappement Unicode de huit caractères, tel que \U00014321 . Dans votre code, l'échappement est suivi du caractère 's', qui n'est pas valide.

Vous devez soit dupliquer tous les backslashes :

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

Ou préfixez la chaîne avec r (pour produire une chaîne brute) :

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

53 votes

Hahaha... C'est un piège dans lequel il est facile de tomber, comme je viens de le faire. Réponse géniale.

1 votes

J'ai trouvé cette erreur dans la docstring d'une fonction lors du portage d'un code 2.x vers python3.

9 votes

J'ai rencontré cette erreur lorsque j'ai utilisé le guillemet triple. ''' des commentaires autour d'une section de code qui contenait une chaîne brute avec une \U dans celle-ci. C'est-à-dire que la chaîne ne m'a pas donné d'erreur jusqu'à ce que j'essaie de la commenter. C'est pour cette raison que la méthode du double backslash est préférable.

41voto

Julio Cesar Points 325

Erreur typique sous Windows car le répertoire utilisateur par défaut est C:\user\<your_user> Ainsi, lorsque vous voulez passer ce chemin en tant qu'argument de chaîne de caractères dans une fonction Python, vous obtenez une erreur Unicode, simplement parce que la balise \u est un échappement Unicode. Si les 8 caractères suivants après le \u ne sont pas numériques, cela produit une erreur.

Pour résoudre ce problème, il suffit de doubler les antislashs : C:\\user\\<\your_user>... Cela permettra à Python de traiter les antislashes simples comme des antislashes simples.

0 votes

Cette réponse n'est pas tout à fait correcte. Les "u" inférieurs et supérieurs sont différents. \uXXXX est pour les échappements unicode à 4 caractères (2 octets) et \UXXXXXXXX est pour les échappements de 8 caractères (4 octets).

35voto

Fiddy Bux Points 337

Préfixe avec 'r' fonctionne très bien, mais il faut que la syntaxe soit correcte. Par exemple :

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

Pas besoin de \\ ici - maintient la lisibilité et fonctionne bien.

0 votes

Comment le guillemet triple a-t-il fonctionné et non le guillemet double ou le guillemet simple ? J'ai essayé et le guillemet triple simple a fonctionné comme un charme mais tout le reste a échoué lamentablement, pouvez-vous m'expliquer ?

0 votes

@Brainiac Si les guillemets doubles sont acceptables pour vous, je les ai utilisés comme ci-dessous sans aucun problème : foo(r"C:\Users\name\ridiculous path with spaces\filename (2).pdf")

12voto

Matthew Cox Points 364

Avec Python 3, j'avais ce problème :

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

a produit cette erreur :

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

la solution qui a fonctionné est :

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

Il semblerait que le \U produisait une erreur et le 'r' qui précède la chaîne désactive l'échappement Unicode de huit caractères (pour une chaîne brute) qui échouait. (C'est un peu une simplification excessive, mais cela fonctionne si vous ne vous souciez pas de l'Unicode).

J'espère que cela aidera quelqu'un

5 votes

Cela n'apporte rien de plus que la réponse acceptée.

7voto

path = pd.read\_csv(\*\*'C:\\Users\\mravi\\Desktop\\filename'\*\*)

L'erreur est due au chemin qui est mentionné

Ajouter 'r' avant le chemin

path = pd.read\_csv(\*\*r'C:\\Users\\mravi\\Desktop\\filename'\*\*)

Cela fonctionnerait très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X