Ftp.retrbinary () Hilfe python

Ich habe ein Python-Skript erstellt, um eine Verbindung zu einem Remserver herzustellen.

datfile = [] for dk in range(len(files)): dfnt=files[dk] dpst=dfnt.find('.dat') if dpst == 15: dlist = dfnt[:] datfile.append(dlist) assert datfile == ['a.dat','b.dat'] # True 

Die wie Sie sehen können, erstellen Sie eine Liste. Jetzt gebe ich diese liste an

 ftp.retrbinary('datfile') 

Aber diese Zeilen geben einen Fehler zurück:

 typeerror: retrbinary() takes at least 3 arguments (2 given) 

Nicht sicher, was sucht?

One Solution collect form web for “Ftp.retrbinary () Hilfe python”

Es sagt Ihnen, dass Sie nicht genug Argumente für die retrbinary Methode retrbinary .

Die Dokumentation legt fest, dass Sie auch eine "Callback" -Funktion angeben müssen, die für jeden empfangenen Datenblock aufgerufen wird. Du wirst eine Callback-Funktion schreiben und etwas mit den Daten ausführen, die es dir gibt (zB schreib es in eine Datei, sammle es im Speicher usw.)

Als eine Seite beachten Sie vielleicht, warum es heißt, es gibt '3' erforderlich Argumente statt nur '2'. Das ist, weil es auch das "Selbst" -Argument zählt, das Python auf Instanzmethoden benötigt, aber du hast das implizit mit der ftp Objektreferenz übergeben.

EDIT – Sieht so aus, als hätte ich Ihre Frage nicht ganz beantwortet.

Für das command solltest du einen gültigen RETR-Befehl übergeben, nicht eine Liste.

 filenames = ['a.dat', 'b.dat'] # Iterate through all the filenames and retrieve them one at a time for filename in filenames: ftp.retrbinary('RETR %s' % filename, callback) 

Für den callback musst du etwas passieren, das kündbar ist (meist eine Funktion irgendwelcher Art), die ein einziges Argument annimmt. Das Argument ist ein Stück von Daten aus der abgerufenen Datei. Ich sage ein "Chunk", denn wenn du große Dateien umgibst, willst du selten die gesamte Datei im Gedächtnis halten. Die Bibliothek ist so konzipiert, dass sie Ihren Rückruf iterativ aufruft, da sie Datenblöcke erhält. Dies ermöglicht es Ihnen, Chunks der Datei zu schreiben, so dass Sie nur eine relativ kleine Menge an Daten im Speicher zu einem bestimmten Zeitpunkt zu halten.

Mein Beispiel hier ist ein bisschen fortgeschritten, aber dein Rückruf kann eine Schließung innerhalb der for-Schleife sein, die in eine Datei schreibt, die geöffnet wurde:

 import os filenames = ['a.dat', 'b.dat'] # Iterate through all the filenames and retrieve them one at a time for filename in filenames: local_filename = os.path.join('/tmp', filename) # Open a local file for writing (binary mode)... # The 'with' statement ensures that the file will be closed with open(local_filename, 'wb') as f: # Define the callback as a closure so it can access the opened # file in local scope def callback(data): f.write(data) ftp.retrbinary('RETR %s' % filename, callback) 

Dies kann auch prägnanter mit einer lambda Anweisung geschehen, aber ich finde Menschen neu in Python und einige seiner funktionalen Konzepte verstehen das erste Beispiel leichter. Dennoch ist hier der FTP-Anruf mit einem Lambda statt:

 ftp.retrbinary('RETR %s' % filename, lambda data: f.write(data)) 

Ich nehme an, Sie könnten dies sogar tun, übergeben die Schreibinstanz Methode der Datei direkt als Ihren Rückruf:

 ftp.retrbinary('RETR %s' % filename, f.write) 

Alle drei dieser Beispiele sollten analog sein und hoffentlich durch sie durchgehen, wird Ihnen helfen zu verstehen, was los ist.

Ich habe jede Art von Fehlerbehandlung zum Beispiel gelassen.

Auch habe ich keinen der oben genannten Code getestet, also wenn es nicht funktioniert, lass es mich wissen und ich werde sehen, ob ich es klären kann.

  • FTP-Dateiname-Codierung
  • 530 Fehler beim Authentifizieren mit ftplib
  • Mit Python's ftplib, um ein Verzeichnis Auflistung, portabel
  • Herunterladen von Textdateien mit Python und ftplib.FTP von z / os
  • Python Script Hochladen von Dateien über FTP
  • Wie lade ich Datei von ftp?
  • Download Zip-Datei über FTP und extrahieren Dateien im Speicher in Python
  • Teilweise Upload mit storbinal in Python
  • Anschließen der GUI-Schnittstelle mit asynchronem (s) ftp-Betrieb
  • Twisted, FTP und "Streaming" große Dateien
  • PIL.Image.save () zu einem FTP-Server
  • Python ist die beste Programmiersprache der Welt.