iteration über lines in file

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
ali2go
User
Beiträge: 23
Registriert: Freitag 23. Oktober 2009, 15:19

Hallo
ich lese einen file ein, und will diesen in einen neuen file umwandeln allerdings nur von einem bestimmten eintrag ab die nächsten 200 lines.
Gibt es da eine geschicktere lösung als die range() mit der bekomme ich es nicht hin..?
Habe es in diesem bsp. über die file.line_num versucht..war aber
nix

Code: Alles auswählen

import os
import csv

workingdir ="E:\\Programme\\eclipse\\workspace\\learning"

names = os.listdir(workingdir)
try:
    outputfile =open("output_selected.csv","w")
except:
    print("daten zugriff nicht moeglich")
    sys.exit()
 
for name in names:
    fileext = os.path.splitext(name)[-1]
    if ".csv" == fileext:
         file = csv.reader(open(name),delimiter=";")
         for line in file:
             if(file.line_num > 1):
                 
                 month = int(line[2])
                 day = int(line[3])
             
                 if month == 3 and day ==1:  # ab hier gerne die nächsten 200 tage
                     i = file.line_num
                     for i in range(file.line_num +214):
                         print (line)
der späte wurm ...
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ungetestet: In Zeile 18:

Code: Alles auswählen

print [line for line in file if 3 <= int(line[2]) <= 9 
       and 1 <= int(line[3]) <= 20] 
Der 20.9. ist nur geschätzt, musst halt berechnen, was das für ein Datum ist 200 Tage vom 1. März ;)

Die explizite Konvertierung zu ``int`` müsste normal auch nicht nötig sein, musst mal ausprobieren.
BlackJack

@ali2go: Du solltest niemals einfach nur ``except`` ohne eine konkrete Ausnahme schreiben. So verschluckt diese Ausnahmebehandlung *alles*. Zum Beispiel auch, wenn Du Dich in dem Block bei einem Namen vertippt hättest, den `NameError` oder `AttributeError`, der dann auftritt.

Und dann solltest Du Dir mal das `glob`-Modul anschauen um die Dateinamen der CSV-Dateien zu ermitteln. Dein Vorgehen klappt so auch nicht, weil `os.listdir()` nur die Namen ohne Pfade liefert.

Der Name `file` existiert schon einmal für den Datei-Datentyp, wie man am Syntax-Highlighting hier im Forum erkennen kann. Den sollte man nicht an andere Objekte binden.

`line` ist etwas irreführend, weil die meisten bei dem Konstrukt ``for line in file`` erwarten würden, dass `line` an die Zeilen in einer Textdatei gebunden wird, hier sind es aber die Datensätze in einer CSV-Datei als Listen.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BlackJack hat geschrieben:`line` ist etwas irreführend, weil die meisten bei dem Konstrukt ``for line in file`` erwarten würden, dass `line` an die Zeilen in einer Textdatei gebunden wird, hier sind es aber die Datensätze in einer CSV-Datei als Listen.
`row`wäre z.B. ein passender Name :)
Antworten