UnicodeDecodeError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LoD
User
Beiträge: 1
Registriert: Donnerstag 5. März 2020, 20:57

Hallo zusammen,

ich bin Pythonneuling und ich weiß auch dass es zu dem Thema hier und woanders Tutorials gibt, die ich auch gelesen habe aber anscheinend bin ich zu doof dafür:

Ich bin unter Windows und ich muss mit 2.7.x arbeiten. Ich habe eine *.txt, die deutsche Dorfnamen enthält. Wenn ich sie im Editor aufmache und dann auch "Speichern unter..." gehe, dann zeigt mir das ANSI an. Das muss auch so bleiben, weil ich von meinen Kollegen nicht erwarten kann, dass sie unter einer bestimmten Kodierung abspeichern. Als in der Datei nur namen ohne Umlaute oder "ß" standen hat mein Skript (momentan ca. 300 Zeilen) super funktioniert, nun habe ich den Ortnamen "Münsingen" eingefügt und laufe gleich am Anfang in den einen Fehler:

Code: Alles auswählen

import sys
import os
import io

try:
	d = io.open("MEINPFAD/config.txt", "r", encoding = "ISO-8859-1")
except:
	print("Dateizugriff auf config.txt nicht erfolgreich!")
	sys.exit(0)

print("\n>>>>>> Lese Konfigurationsdatei...")
alllines = d.readlines()
d.close()

tokens = []
for i in alllines:
	tokens.append(i.strip('\n'))
print(tokens)
print(">>>>>> Suche nach gueltigen Projektpfaden...")
pp = []
p = [x[0] for x in os.walk("T:/Planung/Plaene")]
for i in tokens:
	pp.append([s for s in p if i in s])
print(pp)
Das Ergebnis:
Bild

Was ich v.a. nicht verstehe: beim print von tokens ist das ü ja richtig drin. Es ist doch der richtige Ansatz am am Anfang alles in u-Strings zu bringen?

danke euch
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Python 2.7 ist 2020 eingestellt worden, aber das weißt du sicherlich schon.

Was ich nicht verstehe, dass er den Fehler erst in der List-Comprehension auslöst.
Möglicherweise, ich rate jetzt nur, hat das was mit der internen Verarbeitung der Pfadnamen zu tun.

Um das sauber und vernünftig zu implementieren, wirst du um Python 3 nicht herum kommen.
Gerade die pathlib könnte dir bei dieser Aufgabe helfen.
Gewöhne dir an für Namen mehr als einen Buchstaben zu verwenden, gilt auch für Python 2.7.

Falls du Windows 10 nutzt, kann Python 3 auch über den Window-App-Store installiert werden.
Wichtig ist nur hierbei zu wissen, dass die Installation dann nicht Systemweit ist, sondern für den User.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Pfadnamen sind Byte-Strings, und sie werden mit den Tokens die unicode-Strings sind verglichen durch den in-Operator. Da muss also erstmal einer gewandelt werden, und da kracht es.

Die Loesung besteht darin, die Pfade vorher zu dekodieren, mit dem Encoding in dem sie auf der Platte stehen. Das koennte unter Windows zB cp1252 sein.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LoD: Die Lösung ist `os.walk()` den Pfadnamen als `unicode`-Zeichenkette zu übergeben, denn dann liefert das auch die Datei- und Pfadnamen schon dekodiert als `unicode`-Objekte.

Edit: *Die* Lösung wäre natürlich das nach Python 3 zu portieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten