2009-08-28 4 views
122

Ich benutze Python 3.1, auf einem Windows 7 Maschinen. Russisch ist die Standard-Systemsprache und UTF-8 ist die . Standardcodierung"Unicode-Fehler" Unicode-Landschaft "Codec kann Bytes nicht decodieren ... Kann Textdateien in Python 3 nicht öffnen

auf die Antwort der Suche nach einem previous question, ich habe versucht, die „Codecs“ -Modul mit mir ein wenig Glück zu geben, hier einige Beispiele:.

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

Meine letzte Idee war, dachte ich, Es könnte die Tatsache sein, dass Windows ein paar Ordner, wie zum Beispiel den Ordner "users", ins Russische übersetzt (obwohl die Eingabe von "Benutzern" immer noch der richtige Pfad ist), also habe ich es in der Python31-Ordner. Immer noch kein Glück. Irgendwelche Ideen?

+0

Unrelated auf Ihre Frage, aber es wird dringend empfohlen, Sie Python 3.x nicht verwenden aber, außer du hast einen besonders guten Grund, eine Bibliothek dorthin zu portieren. – aehlke

+1

Wahnfrieden - warum? Nicht so viel Bibliotheksunterstützung, sicher, aber anders als das? – orip

+4

@Wahnfrieden Was? Python 2 soll in Zukunft auslaufen, so dass es sinnvoll ist, Python 3 trotz seines "Mangels" an "Reife" zu verwenden. –

Antwort

260

Das Problem mit der Zeichenfolge ist

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

Hier beginnt \U einen Acht-Zeichen Unicode-Escape, wie ‚\ U00014321`. In Ihrem Code folgt auf das Escapezeichen das Zeichen "s", das ungültig ist.

Sie müssen entweder alle Backslashes duplizieren oder die Zeichenfolge mit r voranstellen (um eine rohe Zeichenfolge zu erzeugen).

+19

Hahaha ... Was für eine einfache Falle, in die ich fallen kann, wie ich gerade habe. Tolle Antwort. –

+0

Ich fand diesen Fehler in einer Funktion Docstring beim Portieren eines 2.x-Codes nach Python3. –

+3

Ich lief in diesen Fehler, wenn ich Triple-Anführungszeichen '' ''Kommentare um einen Codeabschnitt verwendete, der eine rohe Zeichenfolge mit einem \ U darin enthielt. I.E. Die Zeichenfolge gab mir keinen Fehler, bis ich sie auskommentieren wollte. Aus diesem Grund könnte die doppelte Backslash-Methode bevorzugt werden. –

2

Ich hatte den gleichen Fehler in Python 3.2.

Ich habe Skript für E-Mail zu senden und:

csv.reader(open('work_dir\uslugi1.csv', newline='', encoding='utf-8')) 

als ich das erste Zeichen in der Datei entfernen uslugi1.csv gut funktioniert.

+0

Dies wäre ein Workaround, aber die richtige Antwort ist oben aufgeführt. – Johnny

3

Siehe openpyxl Dokument, Sie können Änderungen wie folgt tun.

from openpyxl import Workbook 
from openpyxl.drawing.image import Image 

wb = Workbook() 
ws = wb.active 
ws['A1'] = 'Insert a xxx.PNG' 
# Reload an image 
img = Image(**r**'x:\xxx\xxx\xxx.png') 
# Insert to worksheet and anchor next to cells 
ws.add_image(img, 'A2') 
wb.save(**r**'x:\xxx\xxx.xlsx') 
+2

Bitte bedenken Sie, dass Sie Ihren Post bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code macht und warum er das Problem löst. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – SuperBiasedMan

+0

Dank @Deepika Anand, seine Werke, könnte bitte erklären, wie? thx –

+1

Verweisen Sie die offizielle Dokumentation auf der Seite: https: //docs.python.org/2/howto/unicode.html. speziell die Zeile "Im Python-Quellcode werden Unicode-Literale als Strings mit dem Präfix 'u' oder 'U' geschrieben: u'abcdefghijk '. Bestimmte Codepunkte können mit der \ escape-Sequenz geschrieben werden, gefolgt von vier Hexadezimalziffern geben den Codepunkt. Die \ U Escape-Sequenz ist ähnlich, erwartet aber 8 Hex-Ziffern, nicht 4. " –

10

Typische Fehler auf Windows, weil das Standardbenutzerverzeichnis C:\user\<your_user> ist, also, wenn Sie diesen Pfad als String-Parameter in eine Python-Funktion verwenden möchten, erhalten Sie einen Unicode-Fehler, nur weil die \u ein Entkommen Unicode ist . Jedes Zeichen, das nicht numerisch ist, erzeugt einen Fehler.

es zu lösen, doppelklicken Sie einfach auf die Schrägstriche: C:\\\user\\\<\your_user>...

1

Oder könnten Sie ersetzen '\' mit '/' in den Weg.

+4

Ich rate dir, die [Tour] zu besuchen und die [Hilfe] zu besuchen. Ihre Antwort scheint unseren Qualitätsstandards nicht zu entsprechen. Sie müssen ein wenig erläutern, warum das funktioniert, vielleicht erstellen Sie das vollständige Codebeispiel. – rene

+0

Willkommen bei Stack Overflow! Bitte bedenken Sie, dass Sie Ihren Beitrag bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code tut und warum es das Problem löst. Eine Antwort, die meist nur Code enthält (auch wenn es funktioniert), hilft dem OP normalerweise nicht, sein Problem zu verstehen. – SuperBiasedMan

0

Ich hatte den gleichen Fehler, nur deinstalliert und wieder installiert das numpy-Paket, das hat funktioniert!

3

Präfixierung mit 'r' funktioniert sehr gut, aber es muss in der richtigen Syntax sein. Zum Beispiel:

Keine Notwendigkeit für \\ [Doppel-Backslashes] hier - behält Lesbarkeit und funktioniert gut.

1

Mit Python 3 Ich hatte dieses Problem:

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

diesen Fehler erzeugt hat:

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

das Update, das gearbeitet ist:

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

Es scheint die '\ U' erzeugte einen Fehler und das 'r' vor dem String löschte das acht Zeichen lange Unicode-Escape (für eine rohe Zeichenkette) Versagen. (Dies ist ein bisschen eine übertriebene Vereinfachung, aber es funktioniert, wenn Sie nicht über Unicode egal)

hoffe, das hilft jemand