Python-FTP-download aller Dateien im Verzeichnis
Python newb hier, also bitte Geduld mit mir. Ich m setzen gemeinsam ein Skript zum download alle Dateien aus einem Verzeichnis via FTP. So weit ich es geschafft habe zu verbinden und Holen einer Datei, aber ich kann nicht scheinen, um zu arbeiten, in batch (bekommen alle Dateien aus dem Verzeichnis) Hier ist was ich habe, so weit:
from ftplib import FTP
import os, sys, os.path
def handleDownload(block):
file.write(block)
print ".",
ddir='C:\\Data\\test\\'
os.chdir(ddir)
ftp = FTP('test1/server/')
print 'Logging in.'
ftp.login('user1\\anon', 'pswrd20')
directory = '\\data\\test\\'
print 'Changing to ' + directory
ftp.cwd(directory)
ftp.retrlines('LIST')
print 'Accessing files'
for subdir, dirs, files in os.walk(directory):
for file in files:
full_fname = os.path.join(root, fname);
print 'Opening local file '
ftp.retrbinary('RETR C:\\Data\\test\\' + fname,
handleDownload,
open(full_fname, 'wb'));
print 'Closing file ' + filename
file.close();
ftp.close()
Ich Wette, Sie können sagen, dass es nicht viel tun, wenn ich es laufen lasse, so dass Anregungen für Verbesserungen wäre sehr dankbar
PS Dies ist keine Hausaufgabe :DD
Dank!!
InformationsquelleAutor Sosti | 2011-03-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es geschafft zu knacken, also jetzt postest das entsprechende bit des Codes für zukünftige Besucher:
Dieser arbeitete für mich auf Python 2.5, Windows XP.
Der empfohlene Weg ist die Verwendung:
ftp.quit()
stattftp.close()
. Bitte diesen linkInformationsquelleAutor Sosti
Wenn das ein problem möchten Sie lösen, könnte ich schlage vor, die
wget
Befehl:Den
--continue
option könnte sehr gefährlich werden, wenn Dateien ändern auf dem server. Wenn Sie Dateien immer nur Hinzugefügt, dann ist es sehr freundlich.Allerdings, wenn dies ist ein Lern-übungen für Sie und Sie möchten, um Ihr Programm zu arbeiten, ich denke, Sie sollten beginnen mit Blick auf diese Zeile:
directory
wurde die remote source-Verzeichnis in am meisten von Ihrem Programm, aber dieos.walk()
- Funktion kann nicht zu Fuß eine remote - Verzeichnis. Sie benötigen zum Durchlaufen der zurückgegebenen Dateien selbst über einen callback geliefert, um dieretrlines
Funktion.Werfen Sie einen Blick auf die
MLSD
oderNLST
Optionen stattLIST
Sie wird wahrscheinlich einfacher zu analysieren. (Beachten Sie, dass FTP nicht wirklich angeben, wie die Listen Aussehen sollte; es war immer gedacht, um werden angetrieben, indem ein Mensch an einer Konsole, oder einen bestimmten Dateinamen übertragen. Also Programme, die kluge Dinge mit FTP-listings wie präsentieren Sie dem Benutzer in einem GUI-wahrscheinlich haben riesige Stapel von den speziellen Fall code, für ungerade oder obskuren Servern. Und Sie werden wohl alle etwas dummes zu tun, wenn er vor schädlichen Datei-Namen.)Können Sie
sftp
statt?sftp
hat eine Spezifikation für wie Datei aufgelistet sind, soll analysiert werden, nicht übertragen von Benutzernamen/Paßwort im Klartext und muss nicht die Riesen-ärgernis, passive vs aktive verbindungen -- es verwendet einfach die einzige Verbindung, was bedeutet, es funktioniert über mehrere firewalls als FTP.Bearbeiten: Sie brauchen, um passieren eine 'callable' - Objekt, um die
retrlines
Funktion. Ein aufrufbares Objekt ist eine Instanz einer Klasse, definiert eine__call__
Methode oder eine Funktion. Während die Funktion ist leichter zu beschreiben, die eine Instanz einer Klasse kann mehr nützlich. (Man könnte die Instanz zu sammeln, die Dateinamen, aber die Funktion hätte schreiben müssen, um eine Globale variable. Schlecht.)Hier ist eine der einfachsten callable-Objekt:
Dieser erstellt eine neue Klasse
c
, die definiert, eine Instanz-Methode__call__
. Dieser druckt nur, seine Argumente in eine ziemlich dämliche Art, aber es zeigt, wie minimal die wir reden. 🙂Wenn Sie wollte etwas schlauer, es könnte so etwas wie dies tun:
Call
iterlines
mit einem Objekt dieser Klasse, dann schauen Sie in das Objektlines
Mitglied für details.retrlines
Funktion erwähnen in meinem post ist ein hyperlink aus der Dokumentation 🙂Vielen Dank für diese, Sie alle klingen wie solide Vorschläge! Ich vergaß zu erwähnen, ich m mit Python 2.5 auf Windows XP (wenn ' s sinnvoll, bei allen), Wenn ich den MLSD-option 'ftp.retrlines('MLSD')', würde der code funktioniert für die iteration oder muss ich mehr ändern? (sicher, es klingt ein wenig verrückt, aber newb hier, erinnern Sie sich?:DD)
Sie würden noch brauchen, um den code so ändern: Sie können nicht die
os.walk()
Funktion. Ich werde Bearbeiten meine Antwort ein bisschen zu zeigen, wie man ein callback-Objekt fürretrlines
.Ich muss zugeben, dass ich tun müssen, einige der Forschung auf diesem, und Versuch zu schreiben, ein paar Zeilen code. Ich hatte gehofft, das problem könnte behoben werden, indem tweaking einige Zeilen, die aber anscheinend ist das Problem grundlegender ist. Werde mein bestes tun, und dann kommen Sie zurück mit keine Ergebnisse. Vielen Dank für all den input und die Anregungen!
InformationsquelleAutor sarnold
dieser code ist ein wenig übertrieben denke ich.
(aus der python-Beispiel https://docs.python.org/2/library/ftplib.html) Nach http://ftp.login() und Einstellung http://ftp.cwd() Sie können nur verwenden:
um alle Dateien herunterzuladen.
InformationsquelleAutor kztd
Ich bin ein Anfänger also ich habe nicht den code effizient, aber ich habe es getestet und es funktioniert. Dies ist, was ich Tat, um den download von Dateien und Ordner vom ftp-site, aber nur mit geringer Tiefe in der Dateistruktur.
Meinst du Kommentare im code?
InformationsquelleAutor PremVijay
Eine rekursive Lösung (py 2.7):
InformationsquelleAutor Iulian Bute
Anstelle der Verwendung von Python-lib, ftp-download ein Verzeichnis, nennen wir Sie eine dos-script von python-Programm. In der dos-Skript verwenden wir die native ftp-Protokoll herunterladen können alle Dateien aus dem Ordner mit
mget *.*
.es ist auch speziell auf die windows (dos)
Manchmal hilft es.
InformationsquelleAutor pythonadmirer