UnicodeEncodeError: 'ascii' codec can't encode character u'

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
MaxL
User
Beiträge: 10
Registriert: Freitag 13. Februar 2015, 18:51

Hallo zusammen,
folgendes Problem: Ich habe mit mit Beautifulsoup einige Datesätze ausgelesen. Über die Python 2.79 Shell bekomme ich diese auch so angezeigt wie ich sie haben möchte - auch mit Umlauten. Das Schreiben in eine MySQL Datenbank funktioniert auch, zumindest bekomme ich keine Fehlermeldung. Nur das Auslesen über Python nicht. Hier bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "C:\Python27\max_codes\br_mysql_datensaetze_anzeigen.py", line 21, in <module>
+(str(data[8])) + ", " +(str(data[9]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 0: ordinal not in range(128)
Woran könnte das liegen?


Dank und Gruß
Max.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@MaxL: zeig doch bitte den dazugehörigen Programmcode. Wie soll man denn nur aus der Fehlermeldung wissen, was da schief läuft?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ergaenzend: Jeder Aufruf von `str` in Python2 auf ein `unicode` Objekt ist ein `.encode('ascii')`. Wenn deine `data` also solche sind hast du deinen Grund. Noch dazu gibt es String Formatierung für genau den Code den man sieht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MaxL hat geschrieben:
Traceback (most recent call last):
File "C:\Python27\max_codes\br_mysql_datensaetze_anzeigen.py", line 21, in <module>
+(str(data[8])) + ", " +(str(data[9]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa9' in position 0: ordinal not in range(128)
Woran könnte das liegen?
Ganz allgemein: Python soll einen Unicode-String in einen Bytestring (also eine Zeichenkette *in* einer bestimmten Repräsentation) wandeln. Wenn im Unicode-String nun Zeichen vorkommen, die im Zielencoding *nicht* darstellbar sind, dann kommt es zu diesem Fehler.

Zu dem Thema, siehe auch meine Signatur :-)

Die ``+`` deuten auf das Konkatenieren von Strings hin... was sind denn das für Stringtypen? Wenn man Unicode- und Bytestrings in Python 2 "mischt", wandelt Python iirc *implizit* alles in Bytestrings um. Und da bei einem impliziten ``encode`` kein besonderes Encoding angegeben wird, nimmt Python "ASCII" und das kann eben z.B. keine Umlaute usw. Du müsstest also das Wandeln an der Stelle vermeiden oder explizit ein Encoding angeben.

Aber wie Sirius3 schon anmerkte können wir ohne mehr Code nur mutmaßen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hyperion: mischt man Unicode- und Bytestrings in Python2 wird alles nach Unicode umgewandelt, weil Unicode die Übermenge von Unicode und ASCII ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sirius3 hat geschrieben:@Hyperion: mischt man Unicode- und Bytestrings in Python2 wird alles nach Unicode umgewandelt, weil Unicode die Übermenge von Unicode und ASCII ist.
Oopsi.. dann war es so rum... Python 2 betreibe ich einfach schon so lange nicht mehr :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Puk
User
Beiträge: 1
Registriert: Dienstag 7. Juli 2015, 08:14

Hallo zusammen,

ich habe ein ähnliches Problem.
Ich greife mit Python auf eine Unicode Datenbank zu und schreibe dort gewisse Daten in eine Textdatei. Soweit so gut. Da sind halt auch Benennungen bei mit Umlauten, "Ö" zum Beispiel, aber alles wird richtig angezeigt.

Wenn ich jetzt allerdings die Datei per Python automatisiert als Anhang einer E-Mail verschicken will, bekomm ich den UnicodeEncodeError.
Das Problem ist auch, dass die Datei eigentlich wieder als Nicht-Unicode Datei umgewandelt werden muss, also iso-8859-1. Aber momentan ist es egal, wie rum ich decodiere/encodiere, entweder kommt die Meldung 'ascii' codec can't encode character u'\xd6' oder 'utf8' codec can't decode byte 0xd6.
Das "Ö" macht halt irgendwie Probleme. Hat einer von euch da noch eine Idee? Wäre echt dringend und weiß echt nicht mehr weiter. Per mailx oder so kann ich die Datei problemlos versenden. Die html-Vorlage ist auch als utf-8 codiert.
Hier noch ein paar Auszüge vom Quelltext.

Wenn ich die Datei schreibe, öffne ich sie mit io.open und gebe den Encoding-Parameter mit.

Code: Alles auswählen

    file = path + "/ordner/datei.txt"
    fkt_msg.send("template",[file],["email@bla.de"])

Code: Alles auswählen

def getbody(vorlage,daten,empf):
    #Die Template-Datei wird rangeholt
    datei = io.open(.. "mail_templates" + os.sep +vorlage+".html", encoding='utf-8')

    if vorlage == "template":
        subject = " Uebergabedatei"
        attachment = daten[0]
        body = datei.read()
        return body,empfaenger,subject,[attachment]
Und dann will ich einfach nur die Mail versenden..

Code: Alles auswählen

def send(vorlage, daten=[],empf=[]):
        Msg = mail.Message()
        Msg.Subject(subject)
        Msg.From(absender)
        for e in empfaenger:
            Msg.To(e)
        Msg.body(body, mimetype="text/html")
        if attachment[0] != "":
            for a in attachment:
                Msg.attach(a)
        Msg.send()
Sobald ich halt die Zuweisung "attachment=daten[0]" mache, kommt dann halt eben der Fehler.
Antworten