Einlesen von regelmäßig ungleichen zeilen

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.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@quant: Kannst du mal präzise deine Probleme beschreiben - mit "Der macht ärger", "geht nicht" etc. kann niemand was anfangen.

Hast du noch Probleme mit dem Ablauf?
1. finde eine Zeile die mit "0" fängt (nicht mit 0 oder " 0" oder "\t0")
2. in der nächsten Zeile kommt jetzt:
- die Anzahl an 'incoming'-Zeilen im Zeichen 0, d.h. im ersten Zeichen
- die Anzahl an 'outgouing'-Zeilen, Zeichen 1 bis 8 (woher weiß ich das?)
3. die nächsten Zeilen (wieviele?) sind incoming-Zeilen, die Zahl, die du hier suchst steht an Zeichen 149 bis 159, bzw. in Python "aktuelle_zeile[149:160]"
4. die nächsten Zeilen sind 'outgoing'-Zeilen -- Die können auch fehlen
weiter zu 1.

Arbeite auf jeden Fall das Tutorial durch - offiziell in englisch in der/deiner Python-Documentation, oder (IIRC im Python-Wiki) auf Deutsch.

hth. Jörg
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

hey

also ich hab folgendes problem ... in der ENTRY_OUT schleife ist die outgoing variable aus mir unverständlichen gründen 0, obwohl sie vorher noch die richtige zahl hat, welche ich vorher ja einlese

Code: Alles auswählen


# /usr/bin/python
# coding:utf-8

import pprint
DATAFILE = "fort.15"
# 'enum' is sometimes dearly missed
SCAN, ENTRY_HEAD, ENTRY_IN, ENTRY_OUT = range(4)
def main():
    #to hold all extracted data,
    events = []
    state = SCAN
    with open(DATAFILE) as data_fd:
        for line in data_fd:
            if state == SCAN and line[0] == "0":
                    incoming = outgoing = 0
                    state = ENTRY_HEAD
            elif state == ENTRY_HEAD or \
                    (state == SCAN and line[0] in "123456789"):
                #prepare counter
                if line[0] in "123456789" and not line[2:9] in "0":
                    incoming,outgoing = int(line[0:1]), int(line[2:9])
                    #create new entry
                    events.append( dict(incoming=[], outgoing=[]) )
                    #local shortcuts (I'm a lazy typist)
                    in_tmp = events[-1]["incoming"]
                    out_tmp = events[-1]["outgoing"]
                    # select next state
                    state = ENTRY_IN if incoming else ENTRY_OUT
            elif state == ENTRY_IN:
#                in_tmp.append(int(line[156:160]))
                incoming -= 1
#             print outgoing
                if not incoming:
                    state = ENTRY_OUT
            elif state == ENTRY_OUT:
#                out_tmp.append(int(line[149:161]))
                print outgoing # hier ist sie 0...
                outgoing -= 1
                if not outgoing:
                    state = SCAN
            else:
#                # print "impossible state:", state
                raise IOError("file wrongly formatted")
    for data in events:
        pprint.pprint(data)
               
if "__main__" == __name__ : main()
ansonsten ist mir die logic schon klar vom ganzen
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

line[2:9] in "0"
funktioniert definitiv nicht - probier's im interpreter aus
int(line[2:9]) == 0
geht wahrscheinlich besser.
Aber: Gib doch besser das Ergebnis nach den Incoming-Zeilen aus, wenn outgoing==0 ist, und überspring "ENTRY_OUT" einfach.
Antworten