Seite 2 von 2

Verfasst: Donnerstag 7. Januar 2010, 14:20
von lubb
joooooooooooooooooo Leute habe den Fehler gefunden,

vor allem danke euch für jeden Vorschlag, den Ihr geleistet habt.

Leider hat Python Probleme mit umlauten, und überall in der Zeilen wo umlauten sind wird die Zeichen falsch geliefert.

Leider wies noch nicht wie ich das Problem beheben kann, jetzt habe ich in der TEXT-File die umlaute entfernt, daher werden die Zeichen richtig geliefert.

Verfasst: Donnerstag 7. Januar 2010, 14:56
von /me
lubb hat geschrieben:Leider hat Python Probleme mit umlauten, und überall in der Zeilen wo umlauten ind wird die Zeichen falsch geliefert.
Das kann man so nicht stehen lassen, denn Python hat keine Probleme mit Umlauten. Ich vermute eher, dass du eine UTF-8-codierte Datei im ASCII-Modus lesen möchtest.

Verfasst: Donnerstag 7. Januar 2010, 15:12
von lubb
/me hat geschrieben:
lubb hat geschrieben:Leider hat Python Probleme mit umlauten, und überall in der Zeilen wo umlauten ind wird die Zeichen falsch geliefert.
Das kann man so nicht stehen lassen, denn Python hat keine Probleme mit Umlauten. Ich vermute eher, dass du eine UTF-8-codierte Datei im ASCII-Modus lesen möchtest.
da hast du recht man soll die richtige Codierung einstellen.

ich habe in der erste Zeile

Code: Alles auswählen

# -*- coding: iso-8859-1 -*- 


für die Deutsche Codierung trotzdem hat nicht geklappt.

hier ist die Erklärung http://www.python-forum.de/post-56356.html#56356

wie kann ich jetzt die Codierung einstellen

Verfasst: Donnerstag 7. Januar 2010, 15:38
von /me
lubb hat geschrieben:da hast du recht man soll die richtige Codierung einstellen.

ich habe in der erste Zeile

Code: Alles auswählen

# -*- coding: iso-8859-1 -*- 


für die Deutsche Codierung trotzdem hat nicht geklappt.
Das hat nichts damit zu tun, wie die Daten aus einer Datei gelesen werden.

Schau dir mal das codecs-Modul an.

Verfasst: Donnerstag 7. Januar 2010, 16:16
von cofi
Das encoding-Cookie ist nur dazu da, dem Interpreter mitzuteilen, wie die Python-Datei kodiert ist, d.h. der Interpreter ist damit z.B. in der Lage Umlaute in String-Literalen zu bearbeiten ohne sich zu verschlucken.

Es hat nichts, ich wiederhole: NICHTS, mit den Daten zu tun, die das Modul bearbeitet.

Die Loesung ist, wie /me schon angedeutet hat, `codecs.open` statt `open` zu nutzen oder eben von Hand die (Byte-)Strings zu decodieren.

Verfasst: Donnerstag 7. Januar 2010, 22:24
von BlackJack
@HWK: Ähm, das funktioniert so gar nicht. Schau Dir noch mal an was `lines` und was `line` ist und *was* der originale Code damit macht. Wenn Du normale "slice"s verwenden willst, müsstest Du zum Beispiel erst einmal *alle* Zeilen in den Speicher lesen. Das vermeidet der alte Quelltext mit der Schleife und dem Test und meine Variante davon mit `islice()`.

Verfasst: Freitag 8. Januar 2010, 10:09
von lubb
Vielen Dank für die großartige und sehr Hilfsreiche Informationen vielen dank für eure Beiträge.

Die Lösung:

Code: Alles auswählen

import os
import codecs
import locale 

      def ProductProof(self, fName,saleCount, product):
	  preferred_file_encoding = locale.getpreferredencoding() 
	  i=0
	  produktOK=False
	  fWrite = open("report.txt", "a")
          fEOC=codecs.open(fName, 'rU', preferred_file_encoding)
	  for line in fEOC:
	      i+=1
	      typ=line[643:646]
	      print typ
	      if 1 < i < saleCount:
		  if product!=typ:
		      produktOK=True
		      display="WARNING: Product not found in Sale " 
		      display+= str(i)
		      display+="\n"
		      fWrite.write(display)

	  if produktOK==False:
	      fWrite.write("produkt OK"+"\n")
	  fEOC.close() 
	  fWrite.close()
Weitere Infoamtionen findet Ihr unter:

Code: Alles auswählen

http://www.python-forum.de/post-56356.html#56356
http://www.python-forum.de/viewtopic.php?p=72814&sid=2e617ad52d6513486cfc421b1c5dd87d

Verfasst: Freitag 8. Januar 2010, 11:41
von /me
lubb hat geschrieben:

Code: Alles auswählen

	  preferred_file_encoding = locale.getpreferredencoding() 
[...]
          fEOC=codecs.open(fName, 'rU', preferred_file_encoding)
Ja, das kann man so machen.

Wenn du aber weißt, in welcher Codierung die Datei vorliegt, dann ist es sicher besser, das Encoding direkt anzugeben statt es aus der aktuellen Einstellung des Systems zu entnehmen.

Code: Alles auswählen

fEOC = codecs.open(fName, 'rU', "UTF-8")

Verfasst: Freitag 8. Januar 2010, 13:33
von HWK
BlackJack hat geschrieben:@HWK: Ähm, das funktioniert so gar nicht. Schau Dir noch mal an was `lines` und was `line` ist und *was* der originale Code damit macht. Wenn Du normale "slice"s verwenden willst, müsstest Du zum Beispiel erst einmal *alle* Zeilen in den Speicher lesen. Das vermeidet der alte Quelltext mit der Schleife und dem Test und meine Variante davon mit `islice()`.
:oops: Ähm, Du hast natürlich völlig Recht: lines != line.
MfG
HWK