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ß
IF - ELSE macht Probleme
Hallo und Willkommen im Forum.
Es gibt im Forum Pythoncode-Tags, die übernehmen die Einrückung:[/code]
Ich nehme an du willst in den else-Zweig nur, wenn keine passende Datei im Ordner ist? Angenommen das ist dein Code:
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:
Außerdem kann ich dir noch die PEP-8 ans Herz legen, des Weiteren sollte man Dateien mit dem with-Statement öffnen.
Es gibt im Forum Pythoncode-Tags, die übernehmen die Einrückung:
Code: Alles auswählen
[code=python]
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"
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'
the more they change the more they stay the same
Oh, da habe ich einen typo drin.
Es muss "os.path.splitext(f)[1]" statt "os.path.splitext(f)[0]" heißen.
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'
the more they change the more they stay the same
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.
Das ist der Code:
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.
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'
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.
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
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)
Wie wäre es, erst mal alle passenden Namen zu sammeln? Dann kann man die immer noch in eine Dabei schreiben.
Ungetestet:
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'
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ich werfe mal `fnmatch` in den Raum.
Ungetestet:
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
assert encoding_kapiert
Na dann würde ich gleich Glob verwenden.
the more they change the more they stay the same
@Dav1d: Wenn die Kombination `os.listdir()` und `fnmatch` wäre ja, aber hier ist es ja `os.walk()` was rekursiv in alle Unterverzeichnisse geht.