ersteinmal vielen Dank an die Forenmitglieder, ihr habt mir schon öfter geholfen!
Doch hierbei komme ich nicht weiter:
Ich habe ein Skript, das eine Verzeichnisstruktur durchläuft, den aktuellen Ordner ausgibt und zu jeder Datei im Ordner den Namen und die SHA - Prüfsumme ausgibt.
Ausgegeben wird das ganze in eine Datei.
Das Funktioniert soweit. Doch ich habe ein Verzeichnis, in das Streamripper Klassikstreams
schreibt. Dort sind die Dateinamen teilweise schrott, bzw. einzelne Zeichen nicht darstellbar?
Mein System ist OpenSuse 10.2, Encoding ist utf-8.
Hier das Skript: (Die SHA-Summenfunktion stammt auch aus diesem Forum.)
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import locale
import os
import sha
import sys
# Funktionsdefinitionen
def shasum(filepath, blocksize = 1024 * 1024):
def del_old_indexfile():
def walker(a, b, c): # a='haha', b=aktuelles Verzeichniss(String), c=Verzeichnissinhaltsliste von b
'''Eigentliche Programmlogik, muss noch genauer Dokumentiert werden.
Hackstatus, aber in der Funktionsweise getestet.'''
datei = cwd + '/Inhaltsliste.txt'
datei = os.path.normcase(datei)
f = codecs.open(datei, 'a', 'utf-8') # keine Probleme mehr mit Umlauten in Dateinamen
string_b = '\n' + b + '\n\n'
f.write(string_b)
for eintrag in c:
if os.path.isfile(os.path.normcase(b + os.sep + eintrag)) == 1: # Probleme mit ASCII - Unicode Dateinamen!
sha_summe = shasum(b + os.sep + eintrag)
f.write(' SHA-Summe: ' + sha_summe + ' Datei: ' + eintrag + '\n')
else:
f.write(' Verzeichnis: ' + eintrag + '\n')
f.close()
print datei,
print 'geschrieben.'
def get_file_encoding(f):
if hasattr(f, "encoding"):
return f.encoding
else:
return "not set"
# Skriptbeginn
print
# Encodings des Systems ausgeben
print "sys.stdin.encoding:", get_file_encoding(sys.stdin)
print "sys.stdout.encoding:", get_file_encoding(sys.stdout)
print "sys.stderr.encoding:", get_file_encoding(sys.stderr)
print "sys.getdefaultencoding():", sys.getdefaultencoding()
print "sys.getfilesystemencoding():", sys.getfilesystemencoding()
print "locale.getpreferredencoding():", locale.getpreferredencoding()
# Ermitteln des aktuellen Arbeitsverzeichnisses cwd = ('c'urrent 'w'orking 'd'ir)
cwd = os.getcwdu() # Wie getcwd() aber in Unicode
print 'aktuelles Arbeitsverzeichniss: %s' % cwd
print
del_old_indexfile()
os.path.walk(cwd, walker, 'haha') # 'haha' muss sein, ansonsten Syntaxfehler
# Skriptende
Code: Alles auswählen
vwo-g01@ws08a:~/Streams> python /home/vwo-g01/Programmierung/Python/sha_summe_ver_4.py
sys.stdin.encoding: UTF-8
sys.stdout.encoding: UTF-8
sys.stderr.encoding: UTF-8
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): UTF-8
locale.getpreferredencoding(): UTF-8
aktuelles Arbeitsverzeichniss: /home/vwo-g01/Streams
/home/vwo-g01/Streams/Inhaltsliste.txt geschrieben.
/home/vwo-g01/Streams/Inhaltsliste.txt geschrieben.
/home/vwo-g01/Streams/Inhaltsliste.txt geschrieben.
Traceback (most recent call last):
File "/home/vwo-g01/Programmierung/Python/sha_summe_ver_4.py", line 82, in <module>
os.path.walk(cwd, walker, 'haha') # 'haha' muss sein, ansonsten Syntaxfehler
File "/usr/lib/python2.5/posixpath.py", line 298, in walk
walk(name, func, arg)
File "/usr/lib/python2.5/posixpath.py", line 298, in walk
walk(name, func, arg)
File "/usr/lib/python2.5/posixpath.py", line 290, in walk
func(arg, top, names)
File "/home/vwo-g01/Programmierung/Python/sha_summe_ver_4.py", line 49, in walker
if os.path.isfile(os.path.normcase(b + os.sep + eintrag)) == 1: # Probleme mit ASCII - Unicode Dateinamen!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xba in position 51: ordinal not in range(128)
vwo-g01@ws08a:~/Streams>
Ich komme hier 'vorerst' nicht mehr weiter.
Ein ls des Ordners gibt die Dateinamen mit ?Chinesischen?-Schriftzeichen durchsetzt aus.