Konvertieren mehrer Dateien aus einem Ordner

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
Konfi
User
Beiträge: 2
Registriert: Mittwoch 31. März 2010, 10:49
Kontaktdaten:

Mittwoch 31. März 2010, 12:51

Hallo,

wahrscheinlich laufe ich Gefahr, dass diese Frage trivial ist, aber ich arbeite nun seit 2 Tagen mit Python und das hier ist praktisch das allererste Programm, das ich schreibe. Leider eilt es auch sehr und nachdem ich nun zwei Tage gestöbert habe, komme ich nicht so recht auf das Problem. Also bitte Gedult mit mir:)


Im folgenden mein Code: Zweck ist es, aus der Datei PHI0000 den header auszulesen und in die Datei out_file zu schreiben.
Direkt im Anschluss an den Header sollen Datenreihen aus der Datei it_06_00.ASC ausgelesen werden (in Spalten angeordnet), wobei der header ausgelassen werden soll. Diese Daten sollen dann unter den Header im out_file geschrieben werden.
Sinn ist es, Daten die von einem Programm A erzeugt wurden, mit einem Programm B zu lesen.

Nun zu den Problemen:
Das Programm soll das ganze natürlich nicht nur für die eine Datei (it_06_00.ASC) machen, sondern für alle Dateien in dem Ordner.

Dadurch entsteht auch gleich das zweite Problem. Nicht alle Dateien haben, so wie die o.g. 431 Datenpunkte, sondern immer unterschiedliche viele. Die While- und If-Schleifen brauchen also jeweils variable Endwerte.

Die Routine funktioniert so wie sie jetzt geschrieben ist einwandfrei, nur eben leider nur für diese eine Datei, wegen der o.g. Probleme.
Mir ist bewusst, dass man die Routine bestimmt um einiges optimieren könnte, aber soweit bin ich mit meinem know how leider noch nicht.

Code: Alles auswählen

with open("PHI0000.ASC",'r') as headerfile:

     content=headerfile.readlines()



with open("it_06_00.FIO",'r') as datafile:

     content1=datafile.readlines()

list={}

data=content

out_file=open("testasc.ASC",'w')

i=0

while i in range(919):

    if i<55:

        header=content[i]

        print header

        out_file.write(header)

    elif 54<i and i<486:

        data=content1[i-26]

        zuordnung=data.split()

        list[zuordnung[0]]=zuordnung[1]

        #print data

        print zuordnung[0]

        print >>out_file, zuordnung[0]

    elif 486<i and i<488:

                yheader=content[486]

                out_file.write(yheader)

    elif 488<=i and i<919:

        data=content1[i-459]

        zuordnung=data.split()

        list[zuordnung[0]]=zuordnung[1]

        #print data

        print zuordnung[1]

        print >>out_file, zuordnung[1]

        



    i=i+1



out_file.close()

Vielen Dank für eure Hilfe![/code]
marlob
User
Beiträge: 51
Registriert: Mittwoch 23. August 2006, 20:13

Mittwoch 31. März 2010, 13:15

Du könntest das so programmieren

Code: Alles auswählen

with open("it_06_00.FIO",'r') as datafile:
    for index, line in enumerate(datafile):
        #ab hier dein code
Das ist dann unabhängig von der Anzahl Zeilen in deiner Datei.
In Index steht dann deine Zeilennummer und in line die aktuelle Zeile
Konfi
User
Beiträge: 2
Registriert: Mittwoch 31. März 2010, 10:49
Kontaktdaten:

Mittwoch 31. März 2010, 14:53

Danke. Ich muss aber zugeben, dass ich das nicht ganz verstehe, glaube ich:

Ist Index die Zeile im Dokument, in das geschrieben werden soll und line die jeweilige Zeile aus dem Dokument aus dem ich lese?

Und wie bekomme ich es hin, dass ich alle Dateien so lese?


Gruß
BlackJack

Mittwoch 31. März 2010, 15:45

@Konfi: Du solltest vielleicht ein wenig Python lernen, in der Doku nachlesen, und im interaktiven Interpreter ausprobieren. Was `index` ist findest Du dann nämlich selbst schnell heraus.

Noch ein paar Anmerkungen zum Quelltext:

Die Bedingung der ``while``-Schleife schaut immer wieder mit linearer Laufzeit in einer Liste mit Zahlen nach, ob das `i` da drin ist. Das wird also bei jedem Schleifendurchlauf langsamer. Wenn `i` von 0 bis 918 laufen soll, warum diese übermässig komplizierte ``while``-Schleife mit "manuellem" hochzählen von `i`?

Brauchst Du `i` überhaupt? Das kann man wahrscheinlich komplett ohne den Indexzugriff schreiben. Arbeite mal das Tutorial in der Dokumentation durch. Statt zu prüfen ob `i` in einem bestimmten Intervall liegt wäre einzelne Schleifen über "slices" von `content` weniger komplex und einfacher zu verstehen. Vor allem ist `i` ja ein Index in zwei verschiedene Listen mit irgendwelchen Verschiebungen. Das ist doch komplett unverständlich.

Ein Dictionary sollte man nicht an den Namen `list` binden. Das ist sehr verwirrend. Die Zuweisung an `data` danach ist komplett sinnlos.

Mal verwendest Du die `write()`-Methode und mal ``print`` um in die Ausgabedatei zu schreiben. Das würde ich vereinheitlichen. Ich würde eher zu `write()` tendieren.
Antworten