Seite 1 von 1

Problem mit Shelve-Modul

Verfasst: Samstag 30. April 2016, 14:35
von Max77
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.

Re: Problem mit Shelve-Modul

Verfasst: Samstag 30. April 2016, 15:09
von 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'

Re: Problem mit Shelve-Modul

Verfasst: Donnerstag 5. Mai 2016, 12:03
von Max77
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 ?

Re: Problem mit Shelve-Modul

Verfasst: Donnerstag 5. Mai 2016, 12:25
von 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.

Re: Problem mit Shelve-Modul

Verfasst: Donnerstag 5. Mai 2016, 13:08
von Max77
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 :-)