String : falsches String aus Datei gelesen

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ok, das sind alles Jungs - wie sähe der Eintrag einer Frau aus? (pastebin, wäre wirklich angebracht)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Müsste der OP die Datei eventuell mit "rb" öffnen? Es scheint ja ein Binärformat zu sein.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

BlackJack hat geschrieben:Das bekommt man mit `itertools.islice()` mit einer Einrückebene weniger hin (ungetestet):

Code: Alles auswählen

from itertools import islice

def gender(filename, sale_count, index): 
    with open(filename, 'r') as lines: 
        for line in islice(lines, 2, sale_count):
            try: 
                print line[index]
            except IndexError:
                print '?'
Das sollte doch aber auch mit "normalen" Slices funktionieren. Dann spart man noch den Import:

Code: Alles auswählen

print line[2:sale_count][index]
MfG
HWK
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

HWK hat geschrieben:
BlackJack hat geschrieben:Das bekommt man mit `itertools.islice()` mit einer Einrückebene weniger hin (ungetestet):

Code: Alles auswählen

from itertools import islice

def gender(filename, sale_count, index): 
    with open(filename, 'r') as lines: 
        for line in islice(lines, 2, sale_count):
            try: 
                print line[index]
            except IndexError:
                print '?'
Das sollte doch aber auch mit "normalen" Slices funktionieren. Dann spart man noch den Import:

Code: Alles auswählen

print line[2:sale_count][index]
MfG
HWK
ich vermute, der Fehler ist nicht in der Programierweise, sonder der Modus wie man die Datei zu lesen öffnet, denn alle geposteten Codes liefern der gleichen Fehler
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

mkesper hat geschrieben:Müsste der OP die Datei eventuell mit "rb" öffnen? Es scheint ja ein Binärformat zu sein.
Modus
"r"
"a"
"r+", "a+"
"rb", "ab", "r+b", "a+b"

dies habe ich bereit versucht ohne erfolg!
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

/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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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()`.
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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")
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
Antworten