FTP Datenverwaltung
Hallo habe bisher nur Kleinigkeiten mit Python realisieren können, da ich mir diese Sprache selbst aneigne. Ich habe aktuell ein Projekt am rumbasteln. Es geht um den Zugriff auf einen FTP-Server. Dort werden regelmäßig Daten abgelegt. Mein Plan ist einen schon integrierten Raspberry Pi herzunehmen und mit crontab einmal die Woche dieses Skript auszuführen. Die Verbindung habe ich schon in dem Skript programmiert und funktioniert auch. Jetzt ist die Frage mit welchem Befehl ich einen vollen Ordner löschen kann. Hab zwar einen Befehl gefunden, aber dieser geht nur wenn der Ordner leer ist. Würde mich über ein bisschen Hilfe freuen. Danke.
Wie gehst du denn im Augenblick vor? Es gibt verschiedenste Bibliotheken, die das Verwenden einen FTP-Verbindung abstrahieren.
Wenn du es "roh" macht: Du musst den Inhalt löschen und anschließend mit rmdir ebenfalls das Verzeichnis.
Wenn du es "roh" macht: Du musst den Inhalt löschen und anschließend mit rmdir ebenfalls das Verzeichnis.
Ja ok mein Problem besteht bloß darin, das eine IP-Cam ihre Alarmbilder dort abspeichert und die Dateien und Ordner zu diesen immer anders benannt sind. Das macht das ganze etwas schwierig automatisiert zu löschen
Hab mit ftplib angefangen
- __blackjack__
- User
- Beiträge: 13202
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@AlexL: Dazu müsste entsprechender Zugriff auf den Server bestehen. Vermute mal den gibt es nicht.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Ich habe mal Folgendes probiert:
Es löscht alle Dateien die direkt im Verzeichnis liegen - aber keine in Unterverzeichnissen (also nicht rekursiv). Da es sich nur um Bilddateien handelt, die automatisch ins Verzeichnis kopiert werden, sollte das auch genügen.
Getestet habe ich den Code. Allerdings bin ich auch nur Anfänger.
Vlt können die Profis noch paar Tipps zu möglichen Fehlerbehandlungen, etc. geben.
P.S. ftp.retrlines('LIST') kann auch auskommentiert werden.
Code: Alles auswählen
from ftplib import FTP
ftp = FTP('server.domain')
ftp.login(user='ich', passwd = 'geheim')
ftp.cwd('verzeichnisname')
ftp.retrlines('LIST')
stdout = ftp.nlst()
anzahl=len(stdout)
# Kann auskommentiert werden
# nur für Konsolenausgabe
print(anzahl)
i=0
while i <= anzahl-1:
var=stdout[i]
i = i + 1
ftp.delete(var)
ftp.close()
Getestet habe ich den Code. Allerdings bin ich auch nur Anfänger.
Vlt können die Profis noch paar Tipps zu möglichen Fehlerbehandlungen, etc. geben.
P.S. ftp.retrlines('LIST') kann auch auskommentiert werden.
Warum nennst Du die Liste von Dateinamen stdout? `var` ist für einen Dateinamen auch kein guter Name. Und die while-Schleife ist eine sehr umständlich geschriebene for-Schleife:
Code: Alles auswählen
from ftplib import FTP
ftp = FTP('server.domain')
ftp.login(user='ich', passwd = 'geheim')
ftp.cwd('verzeichnisname')
filenames = ftp.nlst()
for filename in filenames:
ftp.delete(filename)
ftp.close()
Das mit stdout hatte ich aus einem Beispiel zu Paramiko in Erinnerung. Die Variablenbenennung war mir erst mal nicht sooo wichtig. Ich wollte erst mal herausfinden, wie sich das Problem im Ansatz lösen lässt.
Also mit der For-Schleifen-Syntax von Python habe ich mich noch nicht anfreunden können. Dieses "As" bringt mich gedanklich immer ins Stolpern. C++ und Co. sind in dieser Hinsicht wirklich schöner.
Aber danke für die Hinwise.
Ja, da hast du schon recht.
An das (technische)
for(int i ; i<k ; i++)
{
...
...
}
habe ich mich über die Jahre gewöhnt.
Irgendwann gewöhne ich mich auch an das "literarische" for item in things.
Da sind aber noch groessere Unterschiede - vor allem erlaubt die iterative Form auch ueber nicht-wahlfrei-addressierbare Daten zu laufen. In Python (und auch in C++ mit den entsprechenden iterierbaren Objekten) kannst du
machen. Mit deinem rum-geindexe kommst du da nicht weit. Und es ist immer eine gute Idee, sich bei der Programmierung auf den minimal notwendigen "Vertrag" zu stuetzen. Denn damit wird er flexibler, wenn es mal etwas anderes zu iterieren gibt, zB Dinge, die dann aus einer Datenbank oder aenhlichem einzeln abgeholt werden.
Code: Alles auswählen
for zeile in riesen_datei_die_niemals_in_den_speicher_passt:
...
Oh, ja. Viele relativ moderne Konzepte (Iterieren ist ja auch schon alt geworden) sind an mir vorbei gerauscht und ich habe mich nicht darum gekümmert - wie z.B. Lambda-Funktionen.
Danke für deinen Hinweis. Ich werde mich mal diesbezüglich belesen und bisschen rumprobieren.
Danke euch Habs mittlerweile halbwegs hinbekommen. Bin erst in alle Ordner reingesprungen und in die unterordner bis zu den Bildern hab da alles aufgelistet und alle gelöscht. Dann bin ich wieder ein Verzeichnis zurück hab da den Ordner gelöscht. Dann wieder zurück und wieder aufgelistet und alle Ordner gelöscht. War zwar umständlich von der Programmierung her aber funktioniert so wie ichs mir gedacht habe.