Probleme mit Umlauten aus einer DBF-Datenbank unter Windows

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Montag 19. März 2007, 17:52

Bei kommt wenn ich das Beispiel ausprobiere immer ein Fehler:

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: iso-8859-1 -*- 

# Text definieren 
s_iso88591 = "Hallo Österreich" 

# Text nach Unicode umwandeln 
s_unicode = s_iso88591.decode("iso-8859-1") 

# Text nach UTF-8 umwandeln 
s_utf8 = s_unicode.encode("utf-8") 

print type(s_iso88591) 
print type(s_unicode) 
print type(s_utf8) 

try: 
    print s_iso88591 
except: 
    print "Nicht darstellbar..." 

try: 
    print s_unicode 
except: 
    print "Nicht darstellbar..." 

try: 
    print s_utf8 
except: 
    print "Nicht darstellbar..."
Fehlermeldung:

Traceback (most recent call last):
File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "C:\Documents and Settings\FLORREI\Desktop\test.py", line 8, in ?
In dieser Version braucht man sich zwar nicht um die Zeilenendzeichen
AttributeError: decode
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Montag 19. März 2007, 19:30

Komisch... welche Pythonversion benutzt du?


Bei mir gehts:

Code: Alles auswählen

In [1]: text = "Hallo Österreich"

In [2]: unicode_text = text.decode("iso-8859-1")

In [3]: unicode_text
Out[3]: u'Hallo \xc3\x96sterreich'

In [4]: text
Out[4]: 'Hallo \xc3\x96sterreich'
MfG EnTeQuAk
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 20. März 2007, 10:05

sauerkraut hat geschrieben: In dieser Version braucht man sich zwar nicht um die Zeilenendzeichen
Wo kommt denn diese Zeile im Traceback her???

Kann es sein, das die Datei nicht in iso-8859-1 abgespeichert ist?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Dienstag 20. März 2007, 13:22

Wie schaffe ich es eine Datei explizi in iso-8859 abzuspeichern. Der Editor unter Windows verfügt nur über Unicode, UTF-8 und Ansi.

Ich verwende den PythonWin als Editor und Python 2.1 als Compiler (Windows XP)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 20. März 2007, 13:36

Dann nimm einfach UTF-8 und ersetzte im Skript alle "iso-8859-1" Angaben durch "utf-8" ;)

EDIT: Andere Möglichkeit, verwende nur ASCII in deinen Skripten... Ein Ö kann man auch als "\u00D6" schreiben. Also so:

Code: Alles auswählen

text = u"Hallo \u00D6sterreich"
print repr(text)
print text.encode("iso-8859-1")
print text.encode("utf-8")
Mit http://pylucid.org/index.py/_command/14 ... display/1/ kann man diese Unicode Werte nachschauen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. März 2007, 14:52

sauerkraut hat geschrieben:Wie schaffe ich es eine Datei explizi in iso-8859 abzuspeichern.
Hi sauerkraut!

Wähle "ansi" zum Speichern im Notepad (=Editor). Das entspricht ziemlich genau iso-8859-1.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 20. März 2007, 14:59, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 20. März 2007, 14:53

gerold hat geschrieben:Wähle "ansi" zum Speichern im Notebook (=Editor). Das entspricht ziemlich genau iso-8859-1.
Aber wie sollen damm Umlaute gespeichert werden??? Die sind doch nicht in ANSI enthalten...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. März 2007, 14:58

jens hat geschrieben:Dann nimm einfach UTF-8 und ersetzte im Skript alle "iso-8859-1" Angaben durch "utf-8" ;)
Hi Jens!

Das kannst du unter Windows vergessen. Kaum ein Editor unter Windows kann mit UTF-8 umgehen. Nicht einmal mein Lieblingseditor ConTEXT. Derzeit bist du unter Windows immer noch am Besten dran, wenn du als Encoding "iso-8859-1" verwendest. Schon bei "iso-8859-15" gibt es teilweise Probleme. (Außer du weißt was du tust und verwendest einen Editor, der mit anderen Encodings klar kommt.)

Mein Vorschlag für Anfänger ist also immer noch, im Header jeder Python-Datei als Coding "iso-8859-1" einzutragen und die Dateien ganz normal (ohne irgend eine Angabe des Encodings oder im Notepad ANSI verwenden) abzuspeichern. Windows kommt damit gut klar und Linux sowiso.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. März 2007, 15:04

jens hat geschrieben:Aber wie sollen damm Umlaute gespeichert werden??? Die sind doch nicht in ANSI enthalten...
Hi Jens!

Es funktioniert aber. ;-)

- Unicode entspricht im Windows-Notepad UTF-16
- UTF-8 ist UTF-8
- Ansi entspricht im Windows-Notepad cp1252 was ungefähr iso-8859-1 entspricht.

lg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 20. März 2007, 15:10, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Dienstag 20. März 2007, 15:05

Mein eigentliches Problem ist einfach, dass ich mit einem PYthon Skript aus einer dbf (dbase) Datei lese. Beim Befehl

Code: Alles auswählen

str(row.GetValue(fieldList[x]))
bekomme ich dann halt die Fehlermeldung:

UnicodeError: ASCII encoding error: ordinal not in range(128)

Was daran liegt, dass Sonderzeichen in er Datenbank vorkommen. Wie kann ich das ganze einfach und geshickt umgehen. Mit den Encode Befehle komme ich gerade nicht weiter.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. März 2007, 15:18

sauerkraut hat geschrieben:

Code: Alles auswählen

str(row.GetValue(fieldList[x]))
Mach mal ein

Code: Alles auswählen

repr(row.GetValue(fieldList[x]))
draus und zeige uns was dabei raus kommt. Wahrscheinlich ein in iso-8859-1 codierter String. Aber das sehen wir gleich.

Code: Alles auswählen

type(row.GetValue(fieldList[x]))
ist auch noch interessant.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Dienstag 20. März 2007, 15:40

Richtig... zumindest schmeißt er mir keinen Fehler mehr aus. Allerdings erhalte ich jetzt den ISO Code dafür... kann ich das jetzt wieder umwandeln, ohne das er mir wieder eine exception auswirft?
BlackJack

Dienstag 20. März 2007, 17:05

Du solltest uns eigentlich mal zeigen was die beiden ``print``-Befehle ausgeben wenn ein Zeichen ausserhalb von ASCII in den Daten enthalten ist.

Welchen Typ bekommst Du denn zum Beispiel? `str` oder `unicode`? Davon ausgehend müsste man dann weitersehen was zu tun ist.
sauerkraut
User
Beiträge: 13
Registriert: Montag 26. Februar 2007, 00:01

Dienstag 20. März 2007, 19:11

Also:

Code: Alles auswählen

 Original  : 'LORENZ-B\xd6HLER-UKH-NOTAUFNAHME'
ISO 8859-1:  'LORENZ-B\xd6HLER-UKH-NOTAUFNAHME'
Original  : <type 'string'>
ISO 8859-1: 
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Python21\testDecoding.py", line 7, in ?
    print "ISO 8859-1: ",strText.encode("iso-8859-1")
AttributeError: encode
Jetzt bekomme ich allerdings das Zeichen \xd6 nicht aufgelöst, was eigentlich ein "ö" sein sollte.

Hab einen kleinen Beispielcode geschrieben, damit ich nicht das ganze Skript posten muss:

Code: Alles auswählen

text = "LORENZ-B\xd6HLER-UKH-NOTAUFNAHME"
strText = repr(text)
print "Original  :",str(strText)
print "ISO 8859-1: ",strText.encode("iso-8859-1")
strText = type(text)
print "Original  :",strText
print "ISO 8859-1: ",strText.encode("iso-8859-1")
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. März 2007, 19:22

sauerkraut hat geschrieben:Hab einen kleinen Beispielcode geschrieben, damit ich nicht das ganze Skript posten muss:
Hallo sauerkraut!

Dein Beispielskript bringt dir nichts. Dein ganzes Skript posten bringt auch nichts. Es ist wichtig, zu wissen, was genau an der Stelle im Code von der Datenbank ausgelesen wird, an der es vorher gecrashed ist.

Damit es nicht chrashed und wir das Ergebnis sehen: schreib eine Zeile vor der Stelle an der es den Fehler gab:

Code: Alles auswählen

print repr(row.GetValue(fieldList[x]))
print type(row.GetValue(fieldList[x]))
und zeige uns, was von diesen beiden Codezeilen zurück kommt. Damit sehen wir, welcher Typ (Unicode oder str) von der Datenbankschnittstelle zurückgegeben wird und die Stringrepräsentation des Binärstrings. Anhand dieser Stringrepräsentation wissen wir dann ob du iso-8859-1 oder z.B. UTF-8 zurück bekommst. Anhand dieser Informationen können wir dir sagen, was zu tun ist.

Wenn du ein Beispiel selber schreibst und den Text einfach hin schreibst und nicht die Datenbank abfragst, wie sollen wir dann zu diesen Informationen kommen... :K

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten