Problem mit Shelve-Modul

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
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

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.
BlackJack

@Max77: MacOS ist doof! :twisted:

Code: Alles auswählen

In [12]: unicodedata.normalize('NFKD', 'P\xc3\xb6ppel.jpg'.decode('utf8')).encode('utf8')
Out[12]: 'Po\xcc\x88ppel.jpg'
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

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 ?
BlackJack

@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.
Max77
User
Beiträge: 19
Registriert: Samstag 30. April 2016, 13:42

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