werd aus ner Fehlermeldung nicht schlau

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
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Hi!

Ich versuche mit folgendem Modul: http://www.lfd.uci.edu/~gohlke/code/fmkr.py.html aus einem Script heraus auf ne Filemaker-Datenbank zuzugreifen. Das hat bei ner anderen Datenbank auch schon wunderbar funktioniert. Mit einer mit der ich es jetzt probiere klappt es aber irgendwie gar nicht und ich werde aus der Fehlermeldung nicht so ganz schlau. Wenn ich folgendes probiere:

Code: Alles auswählen

from fmkr import FM, FMError
fmi = FM("filemaker", 80, "http")
fmi.set_db_data("FXManagerProject", "all_fields", maxret=50)
fmi.set_db_password("xmlquery", "xmlquery1")
fmi.add_db_param("IDNumberProject", "282", "bw")
result = fmi.fm_find()
dann bekomme ich diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 287, in fm_find
    return self._commit("find")
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 397, in _commit
    metadata.append(FMField(field.attributes))
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 499, in __init__
    self.name = str(attributes["NAME"].value)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc4' in position 7: ordinal not in range(128)
Was genau meint denn der Fehler und wo kommt dieses falsche Zeichen denn her? Wenn ich meine Strings die ich uebergebe anschaue seh ich irgendwie keine Zeichen die jetzt nicht ASCII sind oder sowas.

Die Datenbank ist nicht von mir und leider sind die Bezeichner fuer Felder, Layouts und Scripte nicht sehr geschickt gewaehlt. Manche haben Leerzeichen drin, Umlaute, usw. Wenn ich so ein Feld abfragen wuerde koennte ich verstehen dass es Probleme gibt. Aber genau deshalb hab ich eigentlich extra ein Feld gewaehlt und ein Layout bei denen das meiner Meinung nach nicht zutrifft.

Fuer alle Denkanstoesse froh dankt schon im Voraus der

Shakebox
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

shakebox hat geschrieben:Was genau meint denn der Fehler und wo kommt dieses falsche Zeichen denn her? Wenn ich meine Strings die ich uebergebe anschaue seh ich irgendwie keine Zeichen die jetzt nicht ASCII sind oder sowas.
Da hast du wohl nicht genau genug geguckt, denn bei dem bemängelten Zeichen handelt es sich um ein "Ä", was eben nicht zum ASCII (unterhalb Code 128) gehört.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Danke fuer die schnelle Antwort. Dass da irgendwo ein nicht-ASCII-konformes Zeichen drin ist, ist mir klar. Nur verstehe ich eben nicht, wo. Denn in meiner Abfrage hab ich ja eben kein "Ä" drin. Ist das Ä dann also in einem der Felder dieser Datenbank als Wert drin oder wie ist das zu verstehen?

Im Moment bin ich einfach ein wenig ueberfordert mit der Fehlermeldung, wo ich denn ueberhaupt suchen muss. Ist es ein Feldname, ein Feldwert, mein Abfragestring oder noch was ganz anderes wo das Ä drinsteht?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Zwar kenne ich das besagte Modul nicht, aber die (vor)letzte Zeile des Tracebacks deutet darauf hin, dass es ein Feld "NAME" gibt und dass der Versuch, den Wert in diesem Feld in str umzuwandeln, zur Fehlermeldung führt, weil da das "Ä" drinsteckt.

Mit der Suche anfangen musst du in Zeile 499 des Moduls ... :wink:
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ok, danke soweit, das hilft mir glaub schon weiter. Ich hab schon nen Verdacht. Mir zu uebersetzen dass "u'\xc4'" ein "Ä" ist war glaub der entscheidende Tipp.

BTW: wie kann man das in Python denn schnell rauskriegen? Mit so Zeichencodierung usw. hab ich mich noch nicht beschaeftigt. Danke!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

shakebox hat geschrieben: das in Python denn schnell rauskriegen? Mit so Zeichencodierung usw. hab ich mich noch nicht beschaeftigt. Danke!

Code: Alles auswählen

In [3]: print u'\xc4'
Ä
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

das hatte ich eben probiert und bekomme folgendes:

Code: Alles auswählen

>>> print u'\xc4'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc4' in position 0: ordinal not in range(128)
Ist da insgesamt bei mir irgendwas falsch konfiguriert oder geht das erst ab 2.6 oder was stimmt da nicht?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Python kann eben nicht herausfinden, was das Encoding deiner Konsole ist und schaltet also auf ACII, und voila, es kracht weil Ä nicht in ASCII vorhanden ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

So pauschal ist das Unsinn. "print" wertet das "encoding" Attribut des verwendeten Dateiobjekts aus, und zumindest unter Linux haben sys.stdout und sys.stderr ein solches encoding-Attribut (das wohl aus aus $LANG abgeleitet wird). "print u'\xc4'" funktioniert hier zumindest, und gibt wie erwartet "Ä" aus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ok, ich hole weiter aus und erzähle das was ich jedes mal erzähle:

Unicode kann nicht direkt ausgegeben werden - gar nicht. Wenn man nun einen Unicode-String hat, dann steht der erstmal so für sich da. Wenn man nun aber ``print`` aufruft und einen Unicode-String übergibt, dann muss ja damit etwas passieren, da man es so nicht anzeigen kann. Also muss man es in einen Bytestring konvertieren. Das läuft dann so ab, dass das Encoding des Ausgabestroms geprüft wird und dieses Encoding verwendet wird, um den Unicodestring in einen Bytestring zu konvertieren. Dieser Bytestring wird dann in den Ausgabestrom geschrieben, die Konsole liest ihn und stellt ihn dann richtig dar. Bei dir ist der Fehler, dass das Encoding des Ausgabestroms ASCII oder unbekannt ist. Python 2.x nimmt bei unbekannt immer ASCII an. Also wird versucht, deinen Unicode-String mit dem Ä in einen ASCII-enkodierten Bytestring zu konvertieren. Das schlägt aber fehl, weil ASCII kein Byte definiert, mit dem Ä dargestellt wird - also gibt es eine Exception.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten