file.tell() gibt keine richtige Position

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.
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Tag zusammen,

ich schreibe zurzeit ein kleines Script, welches aus einer 17864 Zeilen langen Datei mehrere Informationen extrahiert.

Dann File sieht in Grunde genommen so aus:

Code: Alles auswählen

05.11.2014       Prüfung der Archivierbarkeit von Einkaufsbelegen              1

Übersicht: Prüfkennzeichen

1		erster Grund
2		zweiter Grund
3		dritter Grund
4		...
5		...
6		...
7		...
8		...
9		...
10		...
11		...
12		...
13		...
14		...
15		...
16		...
17		...
18		...
19		...
20		...
21		...
22		...
23		...
24		...
05.11.2014       Prüfung der Archivierbarkeit von Einkaufsbelegen              2

Bestellung    BArt Lieferant  Name                                Ekg Best.Datum
Pos.  PTyp Letzt.Vorg Stichtag   Material           Kurztext
PR 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

		'0123456789' 'PEIL' 40038133   Firmenname        RP3 27.12.2007
'00001'       28.12.2007 05.11.2014 '87456123'           GMA 99,7 Fremdmasseln VERZOL
   '3'   Grund drei
		"0123456789" "PSB"  143        Firmenname   RP4 18.07.2008
"00010"      18.07.2008 05.11.2013 "87456321"           GMA 99,7 Verzollungsartikel
   "14"    Grund 14
   "24"    Grund 24
Dabei soll erst bei der zweiten Seite anfangen werden und nur die Werte in den Anführungszeichen benutzt werden.
In diesem Ausschnitt gibt es zwei Datensätze:
Der erste sind die Strings in den einfachen Anführungszeichen und der zweite die in den Doppelten.
Die Anführungszeichen sind in der original Datei natürlich nicht vorhanden.

Habe bis jetzt auch schon dieses Script geschrieben:

Code: Alles auswählen

#!/usr/bin/env python
# # -*- coding: utf-8 -*-
import codecs


ueberschrift_muste = ["Bestellung    BArt Lieferant  Name                                Ekg Best.Datum",
                      "Pos.  PTyp Letzt.Vorg Stichtag   Material           Kurztext",
                      "PR 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"]



seitenanfang = u"Prüfung der Archivierbarkeit von Einkaufsbelegen"
filename = "MM_ARCPREP.txt"

seiten = 0
zeilen = 0
sap_file = codecs.open(filename, 'r', encoding='iso 8859-15')

fehler = False
dateiende = False

while seiten != 2:
    zeile = sap_file.readline()
    if "\n" in zeile:
        zeilen = zeilen + 1
    if seitenanfang in zeile.rstrip():
        seiten = seiten + 1
        print "Neue Seite"

#ueberbrueckung der Leer und Uberschriftzeilen
for i in range(0,5):
    sap_file.readline()
    zeilen = zeilen + 1

while not dateiende:
    bestellung_zeile = sap_file.readline()
    if not bestellung_zeile:
        #Dateiende
        dateiende = True
        break
    zeilen = zeilen + 1
    bestellung_zeile_split = bestellung_zeile.split(" ")
    print bestellung_zeile
    print "Bestellnummer", bestellung_zeile_split[0].replace(" ", "") #Bestellungsnummer
    print "Bart", bestellung_zeile_split[1] #BART
    print "Datum", bestellung_zeile_split[len(bestellung_zeile_split)-1] #Datum
    
    
    pos_zeile = sap_file.readline()
    zeilen = zeilen + 1
    pos_zeile_split = pos_zeile.split()
    print "Pos", pos_zeile_split[0] #Pos
    print "Materialnummer", pos_zeile_split[3] #Materialnummer
    
    fehler_zeile = sap_file.readline()
    zeilen = zeilen + 1
    fehler_zeile_split = fehler_zeile.split()
    print "Fehler", fehler_zeile_split[0] #Fehler
    fehler = True
    
    while fehler:
        cursor_pos = sap_file.tell()
        print "Cursor_pos", cursor_pos
        naechster_fehler = sap_file.readline()
        print naechster_fehler
        zeilen = zeilen + 1
        if int(naechster_fehler[2:4]) <= 24:
            print "Fehler" + naechster_fehler[2:4]
        elif int(naechster_fehler[3:4]) <= 24 and not naechster_fehler[2:12].isdigit():
            print "Fehler", naechster_fehler[3:4]
        else:
            
            fehler = False
            print "Neues Material"
            sap_file.seek(cursor_pos)
Am Ende finde ich die neue Zeile "0123456789 PSB" und möchte im Grunde wieder eine Zeile zurück damit ich ganz oben wieder von vorne beginnen kann. Also merke ich mir vor der Überprüfung ob es ein neuer Fehler ist oder eine neue Materialnummer ist mithilfe von sap_file.tell() wo ich vor dem readline() war und springe dann wieder an diese Stelle zurück, wenn es eine neue Materialnummer ist. Allerdings Springe ich nicht hier hin:

Code: Alles auswählen

' '		"0123456789" "PSB"  143        Firmenname   RP4 18.07.2008
(Habe den Punkt mal mit einfach Anführungszeichen makiert) sondern hier hin:

Code: Alles auswählen

		"0123456789" "PSB"  143        Fi''rmenname   RP4 18.07.2008
Warum ist dies so und wie muss ich das ganze umschreiben um an die erste Stelle der vorherigen Zeile zu kommen?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

@audacity363: Dateien können entweder als Textdatei zeilenweise oder als Binärdatei wahlfrei gelesen werden, beides mischen geht nicht, weil beim zeilenweisen Lesen Daten intern zwischengespeichert werden.
Warum willst Du hin und her springen? Versuch die Datei zeilenweise zu parsen und merke Dir die nötigen Informationen.
Antworten