UnicodeDecodeError

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Hallo,

ich breuchte da ein wenig hilfe. Ich habe ein Postgres Datenbank definiert, desweiteren unteranderem drei Tabellen und einen Parser. Ich möchte automatisch Daten in die Datenbank einlesen. Beim einladen erhalte ich folgende Fehlermeldung.

File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-12: invalid data

Mein Table und Dateneinlese Strucktur

# Define tables in the MetaData
Workshop_table=Table(
'Workshop', bound_meta1,
Column('Workshop_ID', Integer, primary_key=True),
Column('Study', Text(200)), #unicode geht nicht
Column('Date',Unicode(12)),# ist es wirklich ein vollstaendiges datum Fehler
Column('Name', Unicode(200)), # per Hand eingeben
Column('Locetion', Unicode(80)))


File_table=Table(
'File', bound_meta1,
Column('File_ID', Integer, primary_key=True),
Column('Vox_x', Integer),
Column('Vox_y', Integer),
Column('Vox_z', Integer),
Column('Dimension', Unicode(10)),
Column('File_Typ', Unicode(5)),
Column('MeVImp', Unicode),
Column('NameDirectory', Unicode(500)),
Column('FileName', Unicode(500)),
Column ('Workshop_ID', Integer, ForeignKey('Workshop.Workshop_ID'), nullable=False))

Examination_table=Table(
'Examinaton',bound_meta1,
Column('Examination_ID', Integer, primary_key=True),
Column('SerieNr', Integer),
Column('Localisation', Unicode(80)),
Column('ContrasAgent', Unicode(80)),
Column('Date', Date),
Column('AnonymizationCorrect',Unicode(80)),
Column('File_ID', Integer, ForeignKey('File.File_ID'), nullable=False))

mapper(Examination, Examination_table)
mapper(File, File_table, properties={'examination':relation(Examination, backref=backref('File', uselist=False))})

class Examination(object):
def __init__(self, SerieNr, Localisation, ContrasAgent, Date, AnonymizationCorrect):
self.SerieNr=SerieNr
self.Localisation=Localisation
self.ContrasAgent=ContrasAgent
self.Date=Date
self.AnonymizationCorrect=AnonymizationCorrect
def __repr__(self):
return "<Examination_table ('%s','%s','%s','%s','%s','%s')>" % (self.SerieNr, self.Localisation,
self.ContrasAgent, self.Date,
self.AnonymizationCorrect)

Session=sessionmaker()
session=Session()

Examination_dateneinlesen=session.query(File).get(1)
E0=Examination(SerieNr=6, Date='20071212', Localisation='Abdomen', ContrasAgent='protervenöse KM', AnonymizationCorrect=None)
Examination_dateneinlesen.examination.append(E0)
session.flush()

Ich hab den Parser hier weggelassen der Übersichtshalber, da ich auch die Fehlermeldung erhalten wenn ich auch die Daten manuell eingebe.

Ich hoffe ich könnt mir weiter helfen bin für jede hilfe dankbar.

Lg Mirela
BlackJack

@Mirela: `ContrasAgent` ist in der Datenbank als Unicode deklariert und Du übergibst einen Bytestring. Versuch's mal mit einer `unicode`-Zeichenkette.
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Was meinst du damit? Die Eingabewerte darf ich nicht veränder? Woran siehst du das es ein Bytestring ist? An der Leerzeile?

Übrigen das funktioniert auch nicht wenn ich die Eingabewerte ändere.

Z.B. durch eingabe von 'Hallo' ist ja unicode-zeichenkette

Führte zu gleichen Fehlermeldung
BlackJack

Ich meine Objekte vom Typ `unicode` und nicht vom Typ `str`. Die Zeichenkette, die ein 'ö' enthalten soll ist ein Zeichenkettenliteral vom Typ `str`. `unicode`-Literale beginnen mit einem vorangestellten u, also zum Beispiel u'hällo' und dazu muss auch das "encoding cookie" in der Quelltextdatei zur tatsächlich verwendeten Kodierung der Datei passen. Siehe [wiki]Von Umlauten, Unicode und Encodings[/wiki]

Ansonsten: Bei welchem Quelltext bekommst Du eigentlich die Fehlermeldung? Doch nicht bei dem gezeigten, oder?
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Also ich bekomme die Fehlermeldung bei diesen Daten.

Das besonder ist aber das ich beim ersten einladen keine Fehlermeldung erhalte. Es werden aber auch keine Daten eingelesen. Erst beim wiederholten mal erscheint die Fehlermeldung.

Ich hab gerade mit einem Kollegen gesprochen und der hat mich auf encodeing aufmerksam gemacht. Des weitern meinte er es gäbe wohl eine memory weshalb es wohl erst beim zweiten mal zur fehlermeldung führt.
BlackJack

Das ist alles zu vage. Zum Beispiel benutzt Du ja anscheinend irgendein ORM!?

Und nochmal: Welcher Quelltext *genau* führt zu dem Fehler? Bei welchen *genauen* Vorgehen? Wie sieht der *komplette* Traceback aus?

Versuch das Problem mal auf den kleinsten lauffähigen Code zu reduzieren.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Zum Beispiel benutzt Du ja anscheinend irgendein ORM!?
Dem nicht in Code-Tags gesetzten und daher recht unleserlichen Quelltext zu folgern ist das SQLAlchemy.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mirela, du sagt, dass `Examination_table` zwei Spalten `Localisation` und `ContrasAgent` im Unicode-Format hat, steckst aber in der Zeile, die mit `E0=` beginnt, nur Bytestrings in das Objekt. Ich vermute, SA nimmt dir genau dies übel. Du sagst leider nicht, aus welcher Zeile in deinem Code der `UnicodeDecodeError` entspringt.

Achte am besten immer darauf, für "echte" Strings immer nur Unicode-Objekte zu benutzen und die anderen Strings nur dann, wenn es um Bytefolgen geht.

Stefan
Mirela
User
Beiträge: 8
Registriert: Dienstag 7. Oktober 2008, 12:59

Sorry das ich mich erst jetzt melde. Hab keine Email erhalten das jemand geantwortet hat.

Was mein Coding Problem betrifft ich es durch die bestimmung das es utf-8 ist beseitigen können nur bei der Ausgabe konnte ich die Daten dann nicht weiter verarbeiten. Deshalb habe ich mich dann entschlossen die Files die ich Parse zu ändern. In dem ich die Umlaute durch oe usw. ersetzte.

Viele Dank nochmals für eure tipps.
Mirela
Antworten