IF - ELSE macht Probleme

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
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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ß
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

Das hatte ich schon probiert und bekomme den Fehler:

TypeError: 'type' object is unsubscriptable
curly
User
Beiträge: 3
Registriert: Sonntag 10. Juli 2011, 17:36

Also mit der 1 statt der 0 läuft das sauber bei mir.
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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 :-(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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?
Das Leben ist wie ein Tennisball.
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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.
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)
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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'
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich werfe mal `fnmatch` in den Raum.

Ungetestet:

Code: Alles auswählen

for filename in files:
    if fnmatch.fnmatch(basename(filename), "tl*.csv"):
        pass
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Na dann würde ich gleich Glob verwenden.
the more they change the more they stay the same
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.
Antworten