Hallo Leute,
ich habe ein kleines Programm geschrieben das mir für jede Datei im TESTORDNER
die dazugehörige MD5-Prüfsumme ausgibt und in eine Shelve-Datei("dict_book") abspeichert.
Die vier Beispieldateien lauten:
Mäuse.jpg
Pöppel.jpg
Suppengrün.jpg
ä___ö___ü___ß.jpg
Gebe ich den Inhalt der Shelve-Datei mit print wieder aus erhalte ich folgende
Python-Shell-Ausgabe:
{'Suppengru\xcc\x88n.jpg' : '72d53a30d3b16498e7bb9086777d8fc4', '
Po\xcc\x88ppel.jpg' : '7d600a30175c805514efd7b93a92f159',
'Ma\xcc\x88use.jpg' : 'b53157cd3fd5cacba3d41191539018e7',
'a\xcc\x88___o\xcc\x88___u\xcc\x88___\xc3\x9f.jpg' : 'f46b41bfa2875b32b92c529aa9f76166', '
.DS_Store' : '95dc61a5f1098e1243d6a1752c087966'}
-------------------------------------------------------------------------------------------------------------------------------------------
Wenn ich nun die Prüfsumme für die Datei Pöppel.jpg abfrage mit :
woerterbuch = shelve.open("dict_book")
print woerterbuch['Pöppel.jpg']
woerterbuch.close()
Erscheint die Fehlermeldung:
KeyError: 'P\xc3\xb6ppel.jpg'
Ich bräuchte ein Modul/eine Funktion mit der ich den String
'Pöppel.jpg' nach 'Po\xcc\x88ppel.jpg' konvertieren kann.
Dann würde die Abfrage endlich nach dieser Art klappen:
woerterbuch = shelve.open("dict_book")
print woerterbuch[konvertieren('Pöppel.jpg')]
woerterbuch.close()
Ich habe schon encode, decode, unicode, unicodedata , codecs etc. ausprobiert
aber ich bekomme es einfach nicht hin aus 'Pöppel.jpg' den String 'Po\xcc\x88ppel.jpg' zu machen.
Problem mit Shelve-Modul
@Max77: MacOS ist doof!
Code: Alles auswählen
In [12]: unicodedata.normalize('NFKD', 'P\xc3\xb6ppel.jpg'.decode('utf8')).encode('utf8')
Out[12]: 'Po\xcc\x88ppel.jpg'
Vielen Dank BlackJack. Hat soweit funktioniert.
IN:
c = unicodedata.normalize('NFKD', 'P\xc3\xb6ppel.jpg'.decode('utf8')).encode('utf8')
print c
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2[c]
woerterbuch2.close()
OUT:
„Po QUADRAT ppel“
7d600a30175c805514efd7b93a92f159
Aber die PYTHON SHELL gibt nach der print Anweisung nicht Pöppel aus sondern zeigt das Wort
„Po QUADRAT ppel“
Was hat das zu Bedeuten ?
Wenn ich nun den oberen Ausdruck in drei Schritte zerlege bekomme ich merkwürdigerweise unterschiedliche Ausgaben:
IN:
a = 'Pöppel.jpg'
print a
b = a.encode('string_escape')
print b
c = unicodedata.normalize('NFKD', b.decode('utf8')).encode('utf8')
print c
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2[c]
woerterbuch2.close()
OUT:
Pöppel.jpg
P\xc3\xb6ppel.jpg
P\xc3\xb6ppel.jpg
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
return self.func(*args)
File "/Users/frodo/Desktop/Dateien_Bearbeiten/Dateien_mit_Fingerabdruck_48___2.py", line 226, in string
print woerterbuch2[c]
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shelve.py", line 121, in __getitem__
f = StringIO(self.dict[key])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/__init__.py", line 270, in __getitem__
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/__init__.py", line 270, in <lambda>
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
KeyError: 'P\\xc3\\xb6ppel.jpg'
Woran mag das liegen ?
IN:
c = unicodedata.normalize('NFKD', 'P\xc3\xb6ppel.jpg'.decode('utf8')).encode('utf8')
print c
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2[c]
woerterbuch2.close()
OUT:
„Po QUADRAT ppel“
7d600a30175c805514efd7b93a92f159
Aber die PYTHON SHELL gibt nach der print Anweisung nicht Pöppel aus sondern zeigt das Wort
„Po QUADRAT ppel“
Was hat das zu Bedeuten ?
Wenn ich nun den oberen Ausdruck in drei Schritte zerlege bekomme ich merkwürdigerweise unterschiedliche Ausgaben:
IN:
a = 'Pöppel.jpg'
print a
b = a.encode('string_escape')
print b
c = unicodedata.normalize('NFKD', b.decode('utf8')).encode('utf8')
print c
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2[c]
woerterbuch2.close()
OUT:
Pöppel.jpg
P\xc3\xb6ppel.jpg
P\xc3\xb6ppel.jpg
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
return self.func(*args)
File "/Users/frodo/Desktop/Dateien_Bearbeiten/Dateien_mit_Fingerabdruck_48___2.py", line 226, in string
print woerterbuch2[c]
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shelve.py", line 121, in __getitem__
f = StringIO(self.dict[key])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/__init__.py", line 270, in __getitem__
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/__init__.py", line 270, in <lambda>
return _DeadlockWrap(lambda: self.db[key]) # self.db[key]
KeyError: 'P\\xc3\\xb6ppel.jpg'
Woran mag das liegen ?
@Max77: Das bedeutet das die Python-Shell, beziehungsweise das Terminal oder wo immmer die Python-Shell ihre Ausgaben tätigt, mit der normalisierten NFKD-Form in UTF-8 kodiert anscheinend nichts anfangen kann.
Du zerlegst den oberen Ausdruck nicht in drei Schritte sondern machst plötzlich zwischendrin noch etwas anderes: Die Zeichenkette mit 'string_escape' kodieren. Da sollte eigentlich klar sein, dass das den Schlüssel so verändert das er nicht gefunden werden kann, denn so etwas hast Du ja auch nicht in das `shelve` hinein geschrieben. Sollte man auch nicht. Das macht wenig bis gar keinen Sinn.
Du zerlegst den oberen Ausdruck nicht in drei Schritte sondern machst plötzlich zwischendrin noch etwas anderes: Die Zeichenkette mit 'string_escape' kodieren. Da sollte eigentlich klar sein, dass das den Schlüssel so verändert das er nicht gefunden werden kann, denn so etwas hast Du ja auch nicht in das `shelve` hinein geschrieben. Sollte man auch nicht. Das macht wenig bis gar keinen Sinn.
Ja, endlich funktioniert es so wie ich es mir vorgestellt habe. string_escape war schuld.
IN:
a = 'Pöppel.jpg'
print a
print " "
print " "
b = unicodedata.normalize('NFKD', a.decode('utf8')).encode('utf8')
print b
print " "
print " "
print " "
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2
woerterbuch2.close()
OUT:
Pöppel.jpg
Po QUADRAT ppel.jpg
7d600a30175c805514efd7b93a92f159
Nochmal Danke für deine Hilfe
IN:
a = 'Pöppel.jpg'
print a
print " "
print " "
b = unicodedata.normalize('NFKD', a.decode('utf8')).encode('utf8')
print b
print " "
print " "
print " "
woerterbuch2 = shelve.open("dict_book")
print woerterbuch2
woerterbuch2.close()
OUT:
Pöppel.jpg
Po QUADRAT ppel.jpg
7d600a30175c805514efd7b93a92f159
Nochmal Danke für deine Hilfe