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

ich habe ein Text-Datei und möchte bestimmte Wörter auslesen

Code: Alles auswählen

      def Gender(self,fName,saleCount):
	  i=0
	  fEOC=open(fName, 'r')
	  for line in fEOC:
	      i+=1
	      gender=line[369:370]
	      if 1 < i < saleCount:
		  print gender		  
	  fEOC.close() 
code liefert die richtige zeichen aber auch nicht, obwohl in der text datei die gesuchte zeichen immer an der gleiche stelle sind
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ui, das sieht aber nicht besonders gesund aus.
Der Code muss erstmal richtig eingerückt werden und dann sollte man ihn auch anderweitig in Ordnung bringt. Was genau dein Problem ist, wird auch nicht deutlich. Ist dir bewusst, dass du immer nur genau 1 Zeichen pro Zeile ausliest?
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

das program soll genau eine zeichen lesen der position

Code: Alles auswählen

 line[369:370]
bei manschen zeilen wird aber der vorherige zeichen geliefert, also eine zeichen davor.

obwohl der Zeichen immer auf der Position [369:370] sich befindet

an der sentax liegt es nicht denn bei der Position [2:3] wird die richtige zeichen aber immer geliefert.


Der Code ist auf mein rechner richtig eingerückt
BlackJack

@lubb: Wenn manchmal das Zeichen davor geliefert wird, dann stimmt Deine Vermutung, dass das gewünschte Zeichen immer am gleichen Index steht ganz einfach nicht.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

lubb hat geschrieben:obwohl der Zeichen immer auf der Position [369:370] sich befindet
Auch wenn es erst mal nicht falsch ist, frage ich mich warum Du die slice notation verwendest und nicht einfach line[369] abfragst, wenn Du nur ein Zeichen lesen willst?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

<Vermutung>Vielleicht um einen IndexError zu vermeiden.</Vermutung>
BlackJack

@hendrikS: Ein "slice" gibt einfach eine leere Zeichenkette, wenn `line` nicht lang genug ist -- direkter Indexzugriff eine Ausnahme. Nur mal so geraten.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

derdon hat geschrieben:Vielleicht um einen IndexError zu vermeiden.
Interessantes Feature. War mir gar nicht so direkt klar darüber.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Um den IndexError vernünftig abzufangen das hier:

Code: Alles auswählen

def gender(filename, sale_count, index):
    with open(filename, 'r') as lines:
        for i, line in enumerate(lines):
            if 1 < i < sale_count:
                try:
                    print line[index]
                except IndexError:
                    print '?'

Code: Alles auswählen

In [3]: from test import gender

In [4]: gender('test.py', 6, 32)
(
t
?
n
Grüße
Gerrit
BlackJack

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

Die gepostete Codes liefert die gleichen Ergebnissen, bei manchen Zeilen wird die vorherige oder auch der nächste Zeichen geliefert.

die Zeichen wird aber schon mit einen alten Version in VB richtig ermittelt, nun bei Python leider nicht.

die Frage ist: erkennt Python versteckte Zeichen, die dazu führen, den Index zu beinflüssen.
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

hendrikS hat geschrieben:
lubb hat geschrieben:obwohl der Zeichen immer auf der Position [369:370] sich befindet
Auch wenn es erst mal nicht falsch ist, frage ich mich warum Du die slice notation verwendest und nicht einfach line[369] abfragst, wenn Du nur ein Zeichen lesen willst?

ich mochte von der Datei der Produkt auslesen und vergleichen, Produkt besteht aus 3 zeichen
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Magst Du uns mal 'ne Zeile zeigen? (Vielleicht in einem pastebin.)
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

BlackJack hat geschrieben:@lubb: Wenn manchmal das Zeichen davor geliefert wird, dann stimmt Deine Vermutung, dass das gewünschte Zeichen immer am gleichen Index steht ganz einfach nicht.
die gleiche Datei würde von den ähnlichen Code in VB geprüft und die gewünschte Zeichen würden richtig geliefert.

???ich vermute das Python versteckte Zeichen oder vielleicht sonder Zeichen auslieset die den Index verschieben, und so falsche Zeichen liefert. ???
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

da sind die erste 3 zeilen

Code: Alles auswählen

T31301GBB6ARM09KYXSHM09B6GSBV4906386953442001            1211Gans Gustav                             05071979HGRDEB6D  Gans Gustav                             Gutelaunestr. 666                                                                                                       Frankfurt am Main                                     60329    DEU    06997781776605071979MEntenhausen         DBiene Maja                              14081981F                                                 00                                                                                      SHM098142                     00301J0015950001000 CMSHM09         3GRPS001DE3GRGans Gustav                             1WEB WEBWEB WEB19112009142417WEB 05                                                                                 0016 Y                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
T31301GBB6ARM09KYXSHM09B6GSBC295595434         36010043      Musterherr Max                          15061976HGRDEB6D  Musterherr Max                          Meine Straße 12                                                                                                         Wo anders                                             01234    DEU    01588649875215061976Mzu hause            D                                                                                                  00                                                                                      SHM098143   NN                00101G0014450001200 DMSHM09         3GRPU001DE3GRMusterherr Max                          1WEB WEBWEB WEB19112009142439WEB 05                                                                                 0016 N                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
T31301GBB6ARM09KYXSHM09B6GSBC292296100         38070724      Gans Gustav                             05071979HGRDEB6D  Gans Gustav                             Gutelaunestr. 666                                                                                                       Frankfurt am Main                                     60329    DEU    

06997781776605071979MEntenhausen         D                                                 Biene Maja                              14081981F00                                                                                      SHM098144   NN                00401K0014490001000 DMSHM09         3GRPC001DE3GRGans Gustav                             1WEB WEBWEB WEB19112009143029WEB 05                                                                                 0016 N                                                                                                                                                                                                                                                                                               
[/code]
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!
Antworten