FTP Datenverwaltung

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
N.Forkel
User
Beiträge: 4
Registriert: Mittwoch 28. Juli 2021, 10:10

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.
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

FTP kennt keinen Befehl, um ganze Verzeichnisbäume zu löschen, das mußt Du selbst machen, indem Du alle Dateien löschst und danach das leere Verzeichnis.
N.Forkel
User
Beiträge: 4
Registriert: Mittwoch 28. Juli 2021, 10:10

Sirius3 hat geschrieben: Mittwoch 28. Juli 2021, 13:44 FTP kennt keinen Befehl, um ganze Verzeichnisbäume zu löschen, das mußt Du selbst machen, indem Du alle Dateien löschst und danach das leere 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
N.Forkel
User
Beiträge: 4
Registriert: Mittwoch 28. Juli 2021, 10:10

sparrow hat geschrieben: Mittwoch 28. Juli 2021, 12:11 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.
Hab mit ftplib angefangen
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

Wenn ich es richtig verstanden habe, möchtest du einmal in der Woche einen Ordner löschen. Das kannst du doch direkt mit der crontab machen. Einfach

@weekly rm -r /pfad-zum-ordner/ordnername

in die crontab eintragen.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

Ich habe mal Folgendes probiert:

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()
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.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

Sirius3 hat geschrieben: Donnerstag 5. August 2021, 16:35 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:
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.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da in den for-schleifen kein as vorkommt, ist die Verwirrung wohl recht umfänglich.

Und

for(auto& item : things)

in C++ vs Pythons

for item in things

finde ich jetzt nicht einen bemerkenswerten Unterschied.
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

__deets__ hat geschrieben: Donnerstag 5. August 2021, 18:16 Da in den for-schleifen kein as vorkommt, ist die Verwirrung wohl recht umfänglich.

Und

for(auto& item : things)

in C++ vs Pythons

for item in things

finde ich jetzt nicht einen bemerkenswerten Unterschied.
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. :wink:
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

Code: Alles auswählen

for zeile in riesen_datei_die_niemals_in_den_speicher_passt:
    ...
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.
AlexL
User
Beiträge: 16
Registriert: Donnerstag 5. August 2021, 10:38

__deets__ hat geschrieben: Freitag 6. August 2021, 11:48 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,
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.
N.Forkel
User
Beiträge: 4
Registriert: Mittwoch 28. Juli 2021, 10:10

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