Hi, wenn ich eine UTF-8-kodierte Datei einlese, und dann darin folgendermaßen was suche: datei = open(dateiname) for line in datei: if line[0] == '@': ... dann geht das schief, wenn das '@' in der allerersten Zeile der Datei als erstes Zeichen steht. Wenn ich eine Leerzeile einfüge (als erste Zeile), dann ist alles okay. Warum? Und wie finde ich das Zeichen '@' dennoch, wenn es das erste Zeichen der Datei ist? (Hat das vielleicht irgendwie mit BOMs zu tun oder so?) Dank & Gruss, Matthias [Python 2.5, WinXP]
On Thursday 10 July 2008 11:01:05 Matthias Huening wrote:
Hi,
wenn ich eine UTF-8-kodierte Datei einlese, und dann darin folgendermaßen was suche:
datei = open(dateiname) for line in datei: if line[0] == '@': ...
dann geht das schief, wenn das '@' in der allerersten Zeile der Datei als erstes Zeichen steht. Wenn ich eine Leerzeile einfüge (als erste Zeile), dann ist alles okay. Warum? Und wie finde ich das Zeichen '@' dennoch, wenn es das erste Zeichen der Datei ist? (Hat das vielleicht irgendwie mit BOMs zu tun oder so?)
Kann gut sein. Ohne die Datei weiss das ja keiner von uns. Und wenn du schon weisst das sie utf-8-encodiert ist, dann benutz doch einfach das modul codecs, mit BOM_UTF8 als encoding. Diez
Hi,
wenn ich eine UTF-8-kodierte Datei einlese, und dann darin folgendermaßen was suche:
datei = open(dateiname) for line in datei: if line[0] == '@': ...
Sollte sein ... if line[0] == u'@': Datei muss auch in UTF8 kodiert sein. Bitte darauf achten. notfalls lass Dir den Wert ausgeben, damit Du erkennst, wie die Kodierung ist. Aber nicht print verwenden, setzt die Kodierung meistens um. Wenn Du damit nicht weiter kommst, schick den Wert, den Du prüfst in eine Datei und öffne diese mit einem Editor, in dem Du die Kodierung bestimmen kannst. Hoffe, dass ich Dir helfen konnte, Volker PS: Ich verwende dafür häufig gvim (:set enc=utf8) -- Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten Browser-Versionen downloaden: http://www.gmx.net/de/go/browser
Volker Helm (11.07.2008 09:48):
Sollte sein ... if line[0] == u'@':
Datei muss auch in UTF8 kodiert sein. Bitte darauf achten.
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*- Und ob vor das @ als Unicode-Zeichen markiert ist oder nicht, ändert nichts an dem seltsamen Verhalten. Ich habe auch mit Diez' Vorschlag rumgespielt, das codecs-Modul zu verwenden. Gibt auch Probleme. Unter WinXP und Python 2.5 liefert dies codecs.open(dateiname, 'r', 'BOM_UTF8') einen "LookupError: unknown encoding: BOM_UTF8" Hhmm. Matthias
Matthias Huening schrieb:
Volker Helm (11.07.2008 09:48):
Sollte sein ... if line[0] == u'@':
Datei muss auch in UTF8 kodiert sein. Bitte darauf achten.
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*-
Das du im Skript das Encoding deklarierst, heißt noch lange nicht, dass du es auch wirklich im entsprechenden Encoding gespeichert hast. Schau mal bei den Einstellungen deines Editors nach, ob die Datei wirklich als UTF-8 gespeichert wird. Chris
Matthias Huening schrieb:
Volker Helm (11.07.2008 09:48):
Sollte sein ... if line[0] == u'@':
Datei muss auch in UTF8 kodiert sein. Bitte darauf achten.
folgendes tuts, und kommt mit und ohne BOM zurecht: fp = codecs.open("tt.txt", encoding="utf_8_sig") for line in fp: print repr(line) Gruß, Uwe -- Dr. rer. nat. Uwe Schmitt F&E Mathematik mineway GmbH Science Park 2 D-66123 Saarbrücken Telefon: +49 (0)681 8390 5334 Telefax: +49 (0)681 830 4376 uschmitt@mineway.de www.mineway.de Geschäftsführung: Dr.-Ing. Mathias Bauer Amtsgericht Saarbrücken HRB 12339
Matthias Huening wrote:
Volker Helm (11.07.2008 09:48):
Sollte sein ... if line[0] == u'@':
Datei muss auch in UTF8 kodiert sein. Bitte darauf achten.
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*-
Und ob vor das @ als Unicode-Zeichen markiert ist oder nicht, ändert nichts an dem seltsamen Verhalten.
Ich habe auch mit Diez' Vorschlag rumgespielt, das codecs-Modul zu verwenden. Gibt auch Probleme. Unter WinXP und Python 2.5 liefert dies
codecs.open(dateiname, 'r', 'BOM_UTF8')
einen "LookupError: unknown encoding: BOM_UTF8"
Hhmm.
Du könntest mal als Encoding "utf8-sig" probieren. Das beste wäre aber, Du zeigst uns, wie die Datei aussieht, und zwar mittels: datei = open(dateiname) print repr(datei.read(50)) Servus, Walter
Hallo Matthias, On 2008-07-11 14:21, Matthias Huening wrote:
Ja, nee, das ist es nicht. Das Skript ist schon selber UTF-8: # -*- coding: utf-8 -*-
diese Encoding-Zeile sagt Python, dass die _Datei_ in UTF-8 kodiert ist. Das ist wichtig, wenn in deiner Datei andere Zeichen als in 7-Bit-ASCII vorkommen, zum Beispiel Umlaute. Ob vor einem String das u-Präfix steht, ist eine ganz andere Geschichte. Wenn ja, bekommst du einen Unicode-String, wenn nicht, einen Byte-String (8-Bit-Zeichen). Wenn du also # encoding: utf-8 am Anfang der Datei stehen hast, aber einen String mit s = "Byte-String" erzeugst, verweist der Name s "trotzdem" auf einen Byte-String. Wenn oben in der Datei # encoding: latin1 (Datei ist in einem 8-Bit-Encoding) steht und in der Datei u = u"Unicode-String" vorkommt, verweist der Name u auf einen Unicode-String. Die Encoding-Deklaration am Dateianfang entscheidet _nicht_ darüber, ob ein String aus Sicht von Python ein Byte-String oder ein Unicode-String ist. Sie sagt Python "nur", in welchem Encoding Nicht-7-Bit-Zeichen in Zeichenketten-Konstanten vorliegen. Viele Grüße Stefan
participants (7)
-
Christopher Arndt -
Diez B. Roggisch -
Matthias Huening -
Stefan Schwarzer -
Uwe Schmitt -
Volker Helm -
Walter Dörwald