Script zum löschen bestimmter Dateitypen

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
artificial
User
Beiträge: 13
Registriert: Dienstag 4. Dezember 2007, 17:49

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?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@Roschi
Doku hat geschrieben:When opening a file, it’s preferable to use open() instead of invoking the file constructor directly.
artificial
User
Beiträge: 13
Registriert: Dienstag 4. Dezember 2007, 17:49

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)):
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

find -name "*.ext" -exec rm {} \;
?
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

@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. :D

@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
[size=117]Fuer Alle, die in Python einsteigen wollen, kann ich das Buch [url=http://abop-german.berlios.de/]A Byte of Python[/url] nur waermstens empfehlen![/size]
artificial
User
Beiträge: 13
Registriert: Dienstag 4. Dezember 2007, 17:49

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?^^
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

Code: Alles auswählen

for suffix in suffixes:
     if filename.endswith(suffix):
artificial
User
Beiträge: 13
Registriert: Dienstag 4. Dezember 2007, 17:49

Alles klar vielen Dank :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Antworten