Ordnernamen Encoding/Decoding Umlaute

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
hazelnut2
User
Beiträge: 7
Registriert: Mittwoch 2. September 2015, 19:37

Hallo,

ich möchte einen Ordner mit Musik einlesen um zu wissen welche Interpreten und Alben der Interpreten vorhanden sind. Das einlesen der Ordner und anschließende Ausgabe in eine Textdatei funktioniert mittlerweile Problemlos. Jetzt möchte ich natürlich das ganze auch auf die Konsole ausgeben und da habe ich wieder das Problem mit dem Encodieren/Decodieren. Bis jetzt habe ich es zwar geschafft, dass beim einlesen und bei der Ausgabe in die Konsole keine Fehlermeldungen kommen, aber die Umlaute werden falsch dargestellt. Die Umfangreiche ANleitung (http://www.python-forum.de/viewtopic.php?t=5095) hat mir leider nur begrenzt geholfen, da es für Python 2.x gilt und es da anscheinend mehrere Unterschiede gibt. Ich habe versucht mir das Encoding vom Dateisystem anzuzeigen "sys.getfilesystemencoding()" und für die Ausgabe zu decodieren "sys.stdout.encoding". Was mache ich falsch?

Danke

Hier ist mein bisheriger Code:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
__author__ = 'pbergaus'

#cp1251
import os
import codecs
import sys
import locale

print(sys.getfilesystemencoding())
print(sys.stdout.encoding)
os.chdir("M:\\") #Startlaufwerk
music_dir = os.getcwd() #Arbeitsverzeichnis

# print("Aktuelles Verzeichnis: ", music_dir)
temp_paths = os.listdir(music_dir)
dir_counter = 0
for a in temp_paths:
    if os.path.isdir(a) == True:
        dir_counter= dir_counter+1
print(dir_counter)
i = 0
f = open("MusikInterpreten_Alben_topdown.txt","w", encoding="utf8")

for dirName, subDirList, fileList in os.walk(music_dir, topdown=True):
    d=dirName.encode('utf-8', 'ignore')
    e=d.decode(sys.stdout.encoding)
    print("{0} {1}".format(i,e))
    # if dirName in 'Compilations':         #Funktioniert im Moment nicht!
    #     print("Found Compilations")
    #     f.write("Compilations: {0}".format(subDirList) + "\n")
    #     continue
    f.write("Interpret: {0}".format(dirName) + " Album: {0}".format(subDirList) + "\n")
    i += 1
    if i >= 2:      #So wird nur die erste Ebene betreten.
        del subDirList[:]
f.close()
Zuletzt geändert von hazelnut2 am Donnerstag 3. September 2015, 15:40, insgesamt 1-mal geändert.
Windows 10 Pro 64bit; Python 3.6.1 (64bit); Python 3 IDLE
BlackJack

@hazelnut2: Die Umkodierung macht so wie sie da steht keinen Sinn. Entweder funktioniert ein einfaches `print()` oder Du hast verloren und musst dem Benutzer die Möglichkeit geben eine Kodierung vorzugeben die er haben möchte oder die seine Konsole haben möchte und das von Python nicht erkannt wird.
hazelnut2
User
Beiträge: 7
Registriert: Mittwoch 2. September 2015, 19:37

Ich habe mir die standard Encodings nocheinmal angesehen (https://docs.python.org/2.4/lib/standard-encodings.html) und habe durch probieren eine funktionierende Variante gefunden:

Code: Alles auswählen

d=dirName.encode('unicode_internal').decode('iso-8859-1') #Funktioniert

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
__author__ = 'pbergaus'

#cp1251
import os
import codecs
import sys
import locale

print(sys.getfilesystemencoding())
print(sys.stdout.encoding)
os.chdir("M:\\") #Startlaufwerk
music_dir = os.getcwd() #Arbeitsverzeichnis

# print("Aktuelles Verzeichnis: ", music_dir)
temp_paths = os.listdir(music_dir)
dir_counter = 0
for a in temp_paths:
    if os.path.isdir(a) == True:
        dir_counter= dir_counter+1
print(dir_counter)
i = 0
f = open("MusikInterpreten_Alben_topdown.txt","w", encoding="utf8")

for dirName, subDirList, fileList in os.walk(music_dir, topdown=True):
    d=dirName.encode('unicode_internal').decode('iso-8859-1') #Funktioniert
    print("{0} Decoded: {1}".format(i,d))
    # if dirName in 'Compilations':         #Funktioniert im Moment nicht!
    #     print("Found Compilations")
    #     f.write("Compilations: {0}".format(subDirList) + "\n")
    #     continue
    #f.write("Interpret: {0}".format(dirName) + " Album: {0}".format(subDirList) + "\n")
    i += 1
    if i >= 2:      #So wird nur die erste Ebene betreten.
        del subDirList[:]
f.close()
Das Problem ist für mich im Moment erst einmal gelöst.
Danke

EDIT: Encodierung/Decodierung geändert.
Zuletzt geändert von hazelnut2 am Donnerstag 3. September 2015, 16:14, insgesamt 1-mal geändert.
Windows 10 Pro 64bit; Python 3.6.1 (64bit); Python 3 IDLE
BlackJack

@hazelnut2: Das ist extrem wirr und eher ein übler Hack denn eine Lösung.
hazelnut2
User
Beiträge: 7
Registriert: Mittwoch 2. September 2015, 19:37

Habe mein Problem gefunden:
  • Die Codepage der Konsole unterstützt ebenfalls nicht alle Zeichen
Lösung:
  • Codepage der Konsole von chcp 850 zu chcp 65001 ändern


Da meine Textdatei mit "utf-8" Enkodiert wurde, wurden auch alle Zeichen richtig geschrieben und nur die Ausgabe in der Konsole funktionierte nicht.
Windows 10 Pro 64bit; Python 3.6.1 (64bit); Python 3 IDLE
Antworten