Backstory ist im Versuch, einige Daten aus einem FTP-Login, die ich erhielt, zu ziehen. Diese Daten werden täglich aktualisiert, und ich glaube, sie löschen das FTP am Ende jeder Woche oder jeden Monats. Ich habe darüber nachgedacht, ein Datum einzugeben und das Skript täglich auszuführen, um zu sehen, ob es Dateien gibt, die mit dem Datum übereinstimmen, aber wenn die Serverzeit nicht genau ist, kann es zu Datenverlust kommen. Für den Moment möchte ich nur ALLE Dateien herunterladen und dann an der Feinabstimmung arbeiten.ftplib - Python: Skript hängt beim Herunterladen von großen Dateien
Ich habe nicht viel mit dem Kodieren von ftp gearbeitet, aber scheint einfach genug. Das Problem, das ich habe, ist jedoch, dass kleine Dateien ohne Probleme heruntergeladen werden und ihre Dateigrößen geprüft werden. Wenn es versucht, eine große Datei herunterzuladen, die normalerweise ein paar Minuten dauern würde, wird es zu einem bestimmten Punkt (fast die Datei wird abgeschlossen) und dann stoppt es einfach und das Skript hängt.
Beispiel:
Es wird versucht, eine Datei herunterzuladen, die 373.485.927 Bytes groß ist. Das Skript wird ausgeführt und lädt diese Datei bis zu 373485568 Byte herunter. Es stoppt IMMER bei diesem Betrag, nachdem Sie verschiedene Methoden ausprobiert und einen Code geändert haben.
Versteh nicht, warum es immer an diesem Byte stoppt und warum es mit kleineren Dateien (1000 Bytes und darunter) gut funktionieren würde.
import os
import sys
import base64
import ftplib
def get_files(ftp, filelist):
for f in filelist:
try:
print "Downloading file " + f + "\n"
local_file = os.path.join('.', f)
file = open(local_file, "wb")
ftp.retrbinary('RETR ' + f, file.write)
except ftplib.all_errors, e:
print str(e)
file.close()
ftp.quit()
def list_files(ftp):
print "Getting directory listing...\n"
ftp.dir()
filelist = ftp.nlst()
#determine new files to DL, pass to get_files()
#for now we will download all each execute
get_files(ftp, filelist)
def get_conn(host,user,passwd):
ftp = ftplib.FTP()
try:
print "\nConnecting to " + host + "...\n"
ftp.connect(host, 21)
except ftplib.all_errors, e:
print str(e)
try:
print "Logging in...\n"
ftp.login(user, base64.b64decode(passwd))
except ftplib.all_errors, e:
print str(e)
ftp.set_pasv(True)
list_files(ftp)
def main():
host = "host.domain.com"
user = "admin"
passwd = "base64passwd"
get_conn(host,user,passwd)
if __name__ == '__main__':
main()
Die Ausgabe sieht so aus, dass die Datei dddd.tar.gz die große ist und sie nie beendet.
Download-Datei aaaa.del.gz
Datei Herunterladen bbbb.del.gz
Datei Herunterladen cccc.del.gz
Download-Datei dddd.tar.gz
Klingt wie eine Pufferung Problem. Die Größe ist Stopps bei einem Vielfachen von 4096, was ein sehr wahrscheinlicher Wert für einen Puffer ist. Interessanterweise ist der Standardpuffer von rebbinary 8192 und die Größe, bei der er stoppt, ist ** nicht ** ein Vielfaches von 8192, also ist dieser Puffer nicht der Fehler. – spectras
Als Nebenbemerkung ist 'Datei' ein reserviertes Wort in Python. Sie sollten es nicht als Variablennamen verwenden. Benennen Sie es beispielsweise in "fd" um (für "file descriptor"). Ich bezweifle, dass es hier das Problem verursacht, aber Sie sollten diese Möglichkeit zuerst beseitigen. – spectras
Übrigens, das Problem könnte auf der Remote-Seite sein, zum Beispiel, dass der FTP-Server am Ende nicht richtig gelöscht wird - welchen FTP-Server benutzen Sie? Und hast du mit einem anderen getestet? – spectras