Fehler mit Umlauten und dem Umlenkung in eine Datei (Linux)

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
Gast

Hallo zusammen,

ich habe bei einem Script ein Problem festgestellt: Wenn ich das Script starte, dann bekomme ich alle Ausgaben normal; auch Umalute werden korrekt in der Kosnole angezeigt. Wenn ich die Ausgabe nun in eine Datei umlenken will

Code: Alles auswählen

./script.py > datei.html
bekomme ich den Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "./docmaker.py", line 161, in ?
    d.printHTML()
  File "./docmaker.py", line 30, in printHTML
    i.printHTML()
  File "./docmaker.py", line 51, in printHTML
    print "<h1>%s</h1>" % self.titel
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 17: ordinal not in range(128)
Wieso?

Ich habe schon div. Suchen gestartet, aber keine Lösung gefunden.

Ich habe das Encoding per

Code: Alles auswählen

# -*- coding: utf-8 -*-
gesetzt. Außerdem kann er das Script ja abarbeiten, wenn er es nur auf dem Bildschirm ausgeben soll.

Ich hoffe, jemand hat eine Ahnung, woran es klemmt.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Gast.

änder mal die Zeile 51 in:

Code: Alles auswählen

print u"<h1>%s</h1>" % self.titel

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Danke für den Tip, hatte ich bereits ausprobiert! Ändert leider überhaupt nichts ... die Fehlermeldung ist die gleiche.

Mittlerweile habe ich alle Umlaute und ß aus der xml-Quelldatei entfernt. Nun klappt es; aber das ist auf Dauer keine Lösung, ich will nicht immer "ue" statt "ü" schreiben müssen ...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

aha die strings stammen aus einer xml-datei. Konnte ich ja nicht wissen.

Code: Alles auswählen

from codecs import open
...
xml_datei = open("name.xml", "r", encoding="utf-8")
#datei auslesen
xml_datei.close()
Oder arbeitest Du mit einem Parser? Bei expat kannst Du eine Option einstellen, daß er immer "utf-8" zurückgibt bei Strings.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Sorry, ja, hätte ich erwähnen sollen ...
ich arbeite mit dem minidom Parser.

Da habe ich nichts dergleichen gefunden - wobei das Parsen und Ersetzen ja wunderbar funzt - nur wenn ich es in eine andere Datei umleite kommt der Fehler ... imho sehr mysteriöse!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

dann lenk halt nich in eine Datei um, sondern übergib die datei als Kommandozeilenargument an das script. Dann kannst Du die datei mit dem utf-8 encoding zum schreiben öffnen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Tja, daran habe ich auch schon gedacht - werd ich wohl so umsetzen müssen. Eigentlich schade, denn so ist man flexibler, was das Pipen in andere Tools anbelangt. (Klar, kann man auch mit einer fertigen Datei so machen).

Außerdem würde ich dennoch gerne diesen verdammten Fehler finden. Nervt schon ein wenig ...

Trotzdem Danke für Deine Hilfe!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Warum kann man minodom nicht einfach auch eine mit utf-8 encoding geöffnete Datei übergeben? Dann müsstest du doch auch so nur Unicode geliefert bekommen, der auch wirklich als Unicode begriffen werden kann, oder seh ich da jetzt was falsch?
Gast

Hallo nochmal,

das öffnen mit dem Parameter funzt net!
xml_datei = open("name.xml", "r", encoding="utf-8")
Ich bekomme dann folgende Fehlermeldung:
temp=open(file,"r",encoding="utf-8").read()
TypeError: 'encoding' is an invalid keyword argument for this function
Ich benutze Python 2.3.3
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Hast Du auch

Code: Alles auswählen

from codecs import open
geschrieben, so wie's Dookie gezeigt hat?

Gruß, mawe
Gast

Wer lesen kann ist klar im Vorteil ... hatte ich natürlich nicht gemacht.

OK, der Funktionsaufruf geht jetzt, aber das Problem ist gegeblieben:
Traceback (most recent call last):
File "./docmaker.py", line 348, in ?
d=Doc(file,out,format)
File "./docmaker.py", line 21, in __init__
top=xml.dom.minidom.parseString(temp)
File "/usr/lib/python2.3/xml/dom/minidom.py", line 1929, in parseString
return expatbuilder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
File "/usr/lib/python2.3/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 297: ordinal not in range(128)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

'\xf6' ist eben kein Unicode. Da dürfte der Fehler in der XML-Datei liegen. Schau sie dir mal mit nem Hexeditor an, vim kann z.B. Dateien als Hexcodes darstellen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Ok, aber wieso / woher hat er das Zeichen denn dann? Ich öffne die Datei doch nun explizit als Unicode Datei. Der Parser dürfte doch dann keine nicht-Unidocde Zeichen mehr im String finden?

Ich kann mir das gerne mal in einem Hex-Editor ansehen, aber wonach genau soll ich gucken?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

such nach 'f6' das is bei latin-1 ein ö was in unicode als c3b6 dargestellt wird.
[code]#!/usr/bin/env python
import this[/code]
Gast

Das ist wirklich merkwürdig ... ich habe nur die beiden Bytes: c3 b6 anstelle des ü gefunden ... (bei anderen Umlauten sind es auch immer zwei)

Was hat das nun wieder zu bedeuten?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

jo dann ists unicode mit den zwei Bytes. Womit wurde denn die xml-datei erstellt bzw. wo ist die her?
[code]#!/usr/bin/env python
import this[/code]
Gast

Mit dem Texteditor Kate. Gespeichert als utf-8.

Nur, wieso bricht er mit einem Fehler ab?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Da musst die Pythonentwickler fragen, beim Umwandeln mit str.encode() bzw str.decode() kann man mit einem zusätzlichen Argument bestimmen, was bei unumwandelbaren Zeichen geschehen soll:

Code: Alles auswählen

>>> "\xf6".decode("latin-1").encode("ascii", "xmlcharrefreplace")
Out[15]: 'ö'
Standartmässig steht das auf "strict" und bedeutet, daß eben eine Exception geworfen wird.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Hallo nochmal

folgender Thread hat mir geholfen:
http://python.sandtner.org/viewtopic.ph ... 47381b9db1

Ich habe nun folgende Zeile hinzugefügt:

Code: Alles auswählen

temp=open(file,"r",encoding="utf-8").read()
...
top=xml.dom.minidom.parseString(str(temp.encode("utf-8")))
[/quote]
Nun klappts auch :)

Danke noch einmal an alle!

Ciao,
Gast

PS: Ich sollte mich mal registrieren ...
Antworten