Seite 1 von 2

String : falsches String aus Datei gelesen

Verfasst: Mittwoch 6. Januar 2010, 17:15
von lubb
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

Re: String : falsches String aus Datei gelesen

Verfasst: Mittwoch 6. Januar 2010, 17:49
von numerix
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?

Verfasst: Mittwoch 6. Januar 2010, 18:03
von lubb
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

Verfasst: Mittwoch 6. Januar 2010, 18:36
von 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.

Verfasst: Mittwoch 6. Januar 2010, 19:09
von hendrikS
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?

Verfasst: Mittwoch 6. Januar 2010, 19:56
von derdon
<Vermutung>Vielleicht um einen IndexError zu vermeiden.</Vermutung>

Verfasst: Mittwoch 6. Januar 2010, 19:57
von BlackJack
@hendrikS: Ein "slice" gibt einfach eine leere Zeichenkette, wenn `line` nicht lang genug ist -- direkter Indexzugriff eine Ausnahme. Nur mal so geraten.

Verfasst: Mittwoch 6. Januar 2010, 20:35
von hendrikS
derdon hat geschrieben:Vielleicht um einen IndexError zu vermeiden.
Interessantes Feature. War mir gar nicht so direkt klar darüber.

Verfasst: Mittwoch 6. Januar 2010, 21:27
von gkuhl
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

Verfasst: Mittwoch 6. Januar 2010, 22:59
von 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 '?'

Verfasst: Donnerstag 7. Januar 2010, 10:36
von lubb
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.

Verfasst: Donnerstag 7. Januar 2010, 10:44
von lubb
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

Verfasst: Donnerstag 7. Januar 2010, 10:47
von CM
Magst Du uns mal 'ne Zeile zeigen? (Vielleicht in einem pastebin.)

Verfasst: Donnerstag 7. Januar 2010, 10:48
von lubb
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. ???

Verfasst: Donnerstag 7. Januar 2010, 10:52
von lubb
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]

Verfasst: Donnerstag 7. Januar 2010, 11:40
von CM
Ok, das sind alles Jungs - wie sähe der Eintrag einer Frau aus? (pastebin, wäre wirklich angebracht)

Verfasst: Donnerstag 7. Januar 2010, 13:28
von mkesper
Müsste der OP die Datei eventuell mit "rb" öffnen? Es scheint ja ein Binärformat zu sein.

Verfasst: Donnerstag 7. Januar 2010, 13:39
von HWK
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

Verfasst: Donnerstag 7. Januar 2010, 13:52
von lubb
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

Verfasst: Donnerstag 7. Januar 2010, 13:54
von lubb
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!