Seite 1 von 1
Script zum löschen bestimmter Dateitypen
Verfasst: Samstag 22. November 2008, 15:27
von artificial
Hallo zusammen,
ich versuche zur Zeit ein kleines Script zu schreiben, welches einige Pfade durchsucht und in diesen dann verschiedene Dateitypen löscht.
Die verschiedenen Dateitypen habe ich in einer Textdatei definiert die ich im Script einlese
.pls
.m3u
.txt
.png
.jpg
Im folgenden mein Script.
Code: Alles auswählen
#-------------------------------------------------------------------------
import os
#-------------------------------------------------------------------------
datei = open("put.txt", "r")
#laufe durch angegebenes Verzeichnis
for root, dirs, files in os.walk('/home/artificial/test', topdown=False):
for filename in files:
try:
endung = datei.next()
if endung in filename:
print filename
except StopIteration:
continue
datei.close()
Bisher habe ich den eigentlichen Löschvorgang noch nicht implementiert, sondern möchte zunächst testen ob es überhaupt funktioniert indem ich mir die relevanten Dateien ausgeben lasse.
PS. Im übergebenen Ordner befinden sich natürlich auch Dateien die eine der Endungen haben.
Kann mir jemand bei diesem Problem weiterhelfen?
Verfasst: Samstag 22. November 2008, 15:42
von DasIch
Es ist keine so tolle Lösung die Datei die ganze Zeit offen zu lassen, erstelle eine Liste mit den Endungen.
Code: Alles auswählen
with open('suffixfile.txt') as f:
suffixes = [suffix.strip() for suffix in f]
Wenn du über die einzelnen Pfade iterierst prüfst du dann ob die Dateiendung in der suffixes Liste ist:
Code: Alles auswählen
for filename in files:
if any(filename.endswith(suffix) for suffix in suffixes):
# do something with that file here
pass
Verfasst: Samstag 22. November 2008, 16:01
von roschi
so koennte man es machen:
Code: Alles auswählen
import os
f = file("put.txt", "r")
extensions = f.read().strip().split("\n")
f.close()
for root, dirs, files in os.walk("/home/artificial/test", topdown=False):
for filename in files:
if [ext for ext in extensions if filename.endswith(ext)]:
print filename
Verfasst: Samstag 22. November 2008, 16:11
von DasIch
@Roschi
Doku hat geschrieben:When opening a file, it’s preferable to use open() instead of invoking the file constructor directly.
Verfasst: Samstag 22. November 2008, 16:45
von artificial
Vielen Dank an beide.
Ich habe mich für die Variante von DasIch entschieden, welche bisher wunderbar funktioniert.
Allerdings habe ich das auslesen etwas auseinandergenommen
Code: Alles auswählen
suffixes = []
datei = open("put.txt", "r")
for suffix in datei:
suffixes.append(suffix.strip())
Die Lösung mit der for-Schleife innerhalb der Wertzuweisung habe ich noch nie gesehen und wollte mich davon nicht verwirren lassen
Leider verstehe ich folgende Zeile nicht
Code: Alles auswählen
if any(filename.endswith(suffix) for suffix in suffixes):
ist das nicht eigentlich das gleiche wie
Code: Alles auswählen
for suffix in suffixes:
if any(filename.endswith(suffix)):
Verfasst: Samstag 22. November 2008, 17:01
von Leonidas
artificial hat geschrieben:Leider verstehe ich folgende Zeile nicht
Code: Alles auswählen
if any(filename.endswith(suffix) for suffix in suffixes):
ist das nicht eigentlich das gleiche wie
Code: Alles auswählen
for suffix in suffixes:
if any(filename.endswith(suffix)):
Nein. ``any()`` nimmt eine Liste und gibt ``True`` zurück wenn mindestens ein Element wahr ist, andersrum ist das ``any()`` aber überflüssig, weil du ja keine Liste übergibst sondern direkt etwas was wahr oder falsch sein kann.
Verfasst: Samstag 22. November 2008, 17:08
von DasIch
artificial hat geschrieben:Die Lösung mit der for-Schleife innerhalb der Wertzuweisung habe ich noch nie gesehen und wollte mich davon nicht verwirren lassen

http://docs.python.org/tutorial/datastr ... rehensions
Eine Implementation von any könnte so aussehen:
Code: Alles auswählen
def any(iterable):
for item in iterable:
if item:
return True
return False
Verfasst: Samstag 22. November 2008, 17:32
von Dauerbaustelle
find -name "*.ext" -exec rm {} \;
?
Verfasst: Samstag 22. November 2008, 17:35
von roschi
@DasIch:
uff, das wird eine schwere umgewoehnung.

ich mache das schon immer mit ``file``.
@Leonidas & DasIch:
vielen dank fuer die erklaehrung von ``any`` !
jetzt habe ich endlich komplett verstanden, was das ist.
@artificial:
wenn es moeglich ist, sollte man auch list-comprehensions verwenden.
zum besseren verstaendnis:
Code: Alles auswählen
source = ["blubb", "muh", "bla"]
# das hier:
dest = [item for item in source if item.startswith("bl")]
# ist das gleiche wie:
dest = []
for item in source:
if item.startswith("bl"):
dest.append(item)
# wenn man bspw. nur den letzten buchstaben
# jedes eintrages, der die kreterien erfuellt,
# in ``dest`` haben moechte:
dest = [item[-1] for item in source if item.startswith("bl")]
# wenn man alles in ``dest`` groß
# geschrieben haben moechte:
dest = [item.upper() for item in source if item.startswith("bl")]
ich hoffe, das konnte dir die list-combrehensions ein wenig verstaendlicher machen.
lg
roschi
Verfasst: Samstag 22. November 2008, 17:50
von artificial
Im Moment versteh ich leider nurnoch Bahnhof.
Soweit ich es verstanden habe vergleiche ich doch nirgendwo Listen miteinander, oder?
Ist any() eine Funktion die es in Python schon gibt oder muss ich sie selbst implementieren?
Falls ja, warum funktioniert meine Script ohne dass ich das getan hab?^^
Verfasst: Samstag 22. November 2008, 17:56
von cofi
artificial hat geschrieben:Soweit ich es verstanden habe vergleiche ich doch nirgendwo Listen miteinander, oder?
Ist any() eine Funktion die es in Python schon gibt oder muss ich sie selbst implementieren?
Falls ja, warum funktioniert meine Script ohne dass ich das getan hab?^^
Nein. any() ist eine Funktion, die `True' zurückgibt, wenn mindestens ein Element der übergebenen Sequenz `True' ist. Wenn Alle `False' sind, dann gibt sie `False' zurück. Dh du vergleichst keine Listen, sondern prüfst die boolschen Werte der einzelnen Sequenzenmitglieder.
Code: Alles auswählen
for suffix in suffixes:
if any(filename.endswith(suffix)):
Hier hast du eine Sequenz mit nur einem Mitglied, dh es ist gleichbedeutend mit
Verfasst: Samstag 22. November 2008, 18:37
von artificial
Alles klar vielen Dank

Verfasst: Samstag 22. November 2008, 18:48
von DasIch
artificial hat geschrieben:Ist any() eine Funktion die es in Python schon gibt oder muss ich sie selbst implementieren?
any gibt es schon so in Python. Ich wollte nur zeigen wie man diese Funktion implementieren könnte, ich denke es ist leichter die Funktionsweise so zu verstehen.