UnicodeEncodeError

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
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo zusammen,
beim Schreiben der einzelnen Werte innerhalb einer Listbox(TKinter) in eine Textdatei erscheint die unten aufgeführte Fehlermeldung.

Code: Alles auswählen

dateiname=asksaveasfilename(defaultextension=".txt")
fobjekt=open(dateiname, "w")
fobjekt.write("Verzeichnis   : "+folder.get()+"\n")
fobjekt.write("Suchbegriff   : "+searchstring.get()+"\n")
fobjekt.write("Anzahl Treffer: "+str(search_result.size()-1)+"\n")
fobjekt.write("-------------------------------------------------"+"\n")
for element in range(0,search_result.size()-1):
      fobjekt.write(search_result.get(element)+"\n")
fobjekt.close()
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\uwe\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1549, in __call__
return self.func(*args)
File "D:/Daten/System/Python/PyFinder/PyFinder_18_03.pyw", line 261, in exportlist
fobjekt.write(search_result.get(element)+"\n")
File "C:\Users\uwe\AppData\Local\Programs\Python\Python35\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0308' in position 62: character maps to <undefined>


Kann mir jemand sagen, wo das Problem liegt. Ich habe es auch schon gegoogelt, bin aber nicht weiter gekommen.

Vielen Dank und einn sonnigen Tag.

snowflake
Zuletzt geändert von Anonymous am Mittwoch 10. Mai 2017, 12:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@snowflake: Du öffnest eine Textdatei ohne eine explizite Kodierung anzugeben. Dann wird in Python 3 die Kodierung für das System geraten auf der das Programm läuft, was bei Dir cp1252 ist, also die typische Kodierung unter Windows für Fensteranwendungen bei uns in der Gegend. Und Deine Daten die Du speichern möchtest enthalten ein Zeichen das sich nicht als cp1252 kodieren lässt. Konkret:

Code: Alles auswählen

In [5]: unicodedata.name(u'\u0308')
Out[5]: 'COMBINING DIAERESIS'
Also zwei Pünktchen über einem Zeichen die mit dem vorhergehenden Codepoint/Zeichen kombiniert werden:

Code: Alles auswählen

In [6]: print u'a\u0308'
ä

In [7]: print u'p\u0308'
p̈

In [8]: print u'y\u0308'
ÿ

In [9]: print u'n\u0308'
n̈
(Interessant an dieser Stelle das wenn es richtig dargestellt wird, die beiden Pünktchen jeweils über dem Zeichen stehen sollten, es kann aber auch passieren das der Browser sie bei einigen Zeichen rechts daneben anzeigt. Beim 'p' und beim 'n' eventuell, denn das 'ä' und das 'ÿ' gibt es auch ”precomposed” als jeweils eigenen Codepoint.)

Man könnte sich jetzt mit Unicode und den verschiedenen Normalformen befassen und das so normalisieren das diese Kombinationen durch ”precomposed” Zeichen ersetzt werden, wo das geht, und dann hoffen das *dann* alles was Du speichern möchtest als cp1252 kodierbar ist. Oder man gibt explizit eine Kodierung für die Datei an die alles kodieren kann was Unicode an Zeichen bietet. Beispielsweise UTF8. Eventuell macht es auch Sinn *beides* zu machen.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo BlackJack,

vielen Dank zunächst einmal für deine Rückmeldung. Das Problem habe ich jetzt halbwegs verstanden, allerdings weiß ich nicht wie ich es lösen kann.

Mit folgender Zeile kommt eine Fehlermeldung:
fobjekt=open(dateiname, "w", "utf8")
Und so auch:
fobjekt.write(search_result.get(element).encode("utf8")+"\n")
Vielen Dank.

snowflake
BlackJack

@snowflake: *Was* für Fehlermeldungen kommen denn? Beim zweiten hast Du das Problem das Du einen Bytestring mit einem Unicodestring verbindest. Wenn dann müssen schon beide Operanden vom ``+`` Bytes sein.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo BlackJack,

hierbei
fobjekt=open(dateiname, "w", "utf8")
kommt folgende Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\uwe\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1549, in __call__
return self.func(*args)
File "D:\Daten\System\Python\PyFinder\PyFinder_18_03.pyw", line 256, in exportlist
fobjekt=open(dateiname, "w", "utf8")
TypeError: an integer is required (got type str)


Vielen Dank.

snowflake
BlackJack

@snowflake: Schau mal was das dritte Argument von `open()` ist. Da wird laut Ausnahme eine Zahl erwartet. Ist also sehr wahrscheinlich nicht die Kodierung.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo BlackJack,

jetzt hab ich's. Vielen Dank für Deinen Hinweis.

Es geht so:

Code: Alles auswählen

fobjekt=open(dateiname, "w", encoding="utf-8")
Wünsche Dir einen schönen Tag und herzlichen Dank.

snowflake
Antworten