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
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:
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:
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!