Seite 1 von 1

IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 17:07
von jank
Hallo,

ich möchte in einem Ordner nach CSV-Dateien suchen lassen, die mit "tl beginnen".
Wenn es passende Dateien gibt (Bsp.: tl111025.csv), dann wird der if-Zweig richtigerweise durchlaufen, aber AUCH der else-Zweig. Warum?
Der else-Zweig dürfte doch nur durchlaufen werden, wenn es keine passende CSV gibt!?!
Zweite Frage: Wie könnte ich das Script abbrechen, wenn der else-Zweig durchlaufen wird, da dann das Script nicht weiter laufen soll.

for ROOT,DIR,FILES in os.walk(Pfad_File):
for file in FILES:
if (file.startswith('tl')) and (file.endswith('csv')):
file = file[:8] # Dateiendung aus fileliste wird entfernt --> Bsp.: tl111017.csv zu tl111017
fileliste.write(file) # ... und in fileliste.txt geschrieben
fileliste.write("\n")
print "Passende CSV gefunden"
else:
print "Keine passenden CSV gefunden"

Danke für einen Tipp.

Gruß

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 17:19
von Dav1d
Hallo und Willkommen im Forum.

Es gibt im Forum Pythoncode-Tags, die übernehmen die Einrückung:

Code: Alles auswählen

[code=python]
[/code]

Ich nehme an du willst in den else-Zweig nur, wenn keine passende Datei im Ordner ist? Angenommen das ist dein Code:

Code: Alles auswählen

for ROOT,DIR,FILES in os.walk(Pfad_File):
    for file in FILES: 
        if (file.startswith('tl')) and (file.endswith('csv')):
            file = file[:8] # Dateiendung aus fileliste wird entfernt --> Bsp.: tl111017.csv zu tl111017
            fileliste.write(file) # ... und in fileliste.txt geschrieben
            fileliste.write("\n")
            print "Passende CSV gefunden"
        else:
            print "Keine passenden CSV gefunden"
Du iterierst über jede Datei im Ordner, falls eine Datei dem Kriterium nicht entspricht, wird in den else-Zweig "gesprungen". So könnte es gehen:

Code: Alles auswählen

for root, dir, files in os.walk(pfad):
    if any(f.startswith('tl') and os.path.splitext(f)[0] == '.csv' for f in files):
        print 'Passende CSV-Datei gefunden'
    else:
        print 'Kein passende CSV-Datei gefunden'
Außerdem kann ich dir noch die PEP-8 ans Herz legen, des Weiteren sollte man Dateien mit dem with-Statement öffnen.

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 17:46
von jank
Danke für den Tipp.

Klappt leider noch nicht. Nun wird immer nur der else-Zweig durchlaufen :-(
Also immer, als ob es keine passende Datei gibt.

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 17:58
von Dav1d
Oh, da habe ich einen typo drin.

Code: Alles auswählen

for root, dir, files in os.walk(pfad):
    if any(f.startswith('tl') and os.path.splitext(f)[1] == '.csv' for f in files):
        print 'Passende CSV-Datei gefunden'
    else:
        print 'Kein passende CSV-Datei gefunden'
Es muss "os.path.splitext(f)[1]" statt "os.path.splitext(f)[0]" heißen.

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 18:00
von jank
Das hatte ich schon probiert und bekomme den Fehler:

TypeError: 'type' object is unsubscriptable

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 18:04
von curly
Also mit der 1 statt der 0 läuft das sauber bei mir.

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 18:15
von jank
Es klappt jetzt auch bei mir.
Der Fehler wird erzeugt in Zeile 4 file = file[:8] (siehe meine erster Beitrag)

Bin doch noch nicht am Ziel :-(

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 18:41
von EyDu
Und wie lautet der Fehler? Was erwartest du für ein Ergebnis und was passiert tatsächlich? Gibt es vielleicht eine Fehlermeldung? Wie sieht dein aktueller Code aus und verwendest du die von Dav1d vorgeschlagene Methode um an die Dateiendung zu kommen?

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 18:56
von jank
Das ist der Code:

Code: Alles auswählen

 for root, dir, files in os.walk(Pfad_File):
    if any(file.startswith('tl') and os.path.splitext(file)[1] == '.csv' for file in files):
        print 'Passende CSV-Datei gefunden'
        file = file[:8] # Dateiendung aus fileliste wird entfernt --> Bsp.: tl111017.csv zu tl111017
        #fileliste.write(file) # ... und in fileliste.txt geschrieben
        #fileliste.write("\n")        
    else:
        print 'Kein passende CSV-Datei gefunden'
Dieser erzeugt folgende Fehlermeldung: TypeError: 'type' object is unsubscriptable

Ich möchte, dass nach csv-Dateien gesucht wird, die mit tl beginnen. Diese sollen dann in die Datei fileliste geschrieben werden.
es erscheint aber die o.g. Fehlermeldung.

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 19:04
von deets
Warum benutzt du splitext, aber dann ploetzlich hart-codierte indizes?

Und natuerlich schlaegt das fehl, weil du zwar in any(...) einen Generator-Ausdruck mit der Laufvariablen "file" hast - aber im Block danach, innerhalb des if, gibt's diesen namen ja nicht. Was es allerdings gibt ist den eingebauten namen "file". Was uebrigens alles in allem ein schoenes Beispiel dafuer ist, warum man eine solche ueberdefinition von eingebauten Namen nicht taetigen sollte.

Schreib das stattdessen so um, dass du sagst

Code: Alles auswählen

for filename in files:
    if <deintest>:
       filename = os.path.splitext(filename)[0]
       filelist.write(filename)

Re: IF - ELSE macht Probleme

Verfasst: Sonntag 19. Februar 2012, 22:48
von bords0
Wie wäre es, erst mal alle passenden Namen zu sammeln? Dann kann man die immer noch in eine Dabei schreiben.
Ungetestet:

Code: Alles auswählen

basenames = [basename for root, dir, files in os.walk(Pfad_File) for basename, ext in map(os.path.splitext(files)) if ext == ".csv" and basename.startswith("tl")]
for basename in basenames:
    filelist.write(basename + "\n")
if not basenames:
    print 'Kein passende CSV-Datei gefunden'

Re: IF - ELSE macht Probleme

Verfasst: Montag 20. Februar 2012, 15:29
von Hyperion
Ich werfe mal `fnmatch` in den Raum.

Ungetestet:

Code: Alles auswählen

for filename in files:
    if fnmatch.fnmatch(basename(filename), "tl*.csv"):
        pass

Re: IF - ELSE macht Probleme

Verfasst: Montag 20. Februar 2012, 17:19
von Dav1d
Na dann würde ich gleich Glob verwenden.

Re: IF - ELSE macht Probleme

Verfasst: Montag 20. Februar 2012, 18:06
von BlackJack
@Dav1d: Wenn die Kombination `os.listdir()` und `fnmatch` wäre ja, aber hier ist es ja `os.walk()` was rekursiv in alle Unterverzeichnisse geht.