Frage

Ich lerne Python und versuche, einen Code zu schreiben, um zwei Verzeichnisse zu synchronisieren:Einer befindet sich auf dem FTP-Server, der andere auf meiner lokalen Festplatte.Bisher habe ich einen funktionierenden Code geschrieben, aber ich habe ein oder zwei Fragen dazu :)

import os
from ftplib import FTP

h_local_files = [] # create local dir list
h_remote_files = [] # create remote dir list

h_local = 'C:\\something\\bla\\' # local dir

ftp = FTP('ftp.server.com')
ftp.login('user', 'pass')

if os.listdir(h_local) == []:
    print 'LOCAL DIR IS EMPTY'
else:
    print 'BUILDING LOCAL DIR FILE LIST...'
    for file_name in os.listdir(h_local):
        h_local_files.append(file_name) # populate local dir list

ftp.sendcmd('CWD /some/ftp/directory')
print 'BUILDING REMOTE DIR FILE LIST...\n'
for rfile in ftp.nlst():
    if rfile.endswith('.jpg'): # i need only .jpg files
        h_remote_files.append(rfile) # populate remote dir list

h_diff = sorted(list(set(h_remote_files) - set(h_local_files))) # difference between two lists

for h in h_diff:
    with open(os.path.join(h_local,h), 'wb') as ftpfile:
        s = ftp.retrbinary('RETR ' + h, ftpfile.write) # retrieve file
        print 'PROCESSING', h
        if str(s).startswith('226'): # comes from ftp status: '226 Transfer complete.'
            print 'OK\n' # print 'OK' if transfer was successful
        else:
            print s # if error, print retrbinary's return

Dieser Code sollte zwei Python-Listen erstellen:eine Liste der Dateien im lokalen Verzeichnis und eine Liste der Dateien im FTP-Verzeichnis.Nach dem Entfernen von Duplikaten aus Listen sollte das Skript „fehlende“ Dateien in mein lokales Verzeichnis herunterladen.

Im Moment tut dieser Code das, was ich brauche, aber mir ist aufgefallen, dass sich meine Ausgabe beim Ausführen nicht so verhält, wie ich es mir vorgestellt habe :)

Meine aktuelle Ausgabe lautet zum Beispiel:

PROCESSING 2012-01-17_07.05.jpg
OK

# LONG PAUSE HERE

PROCESSING 2012-01-17_07.06.jpg
OK

# LONG PAUSE HERE

PROCESSING 2012-01-17_07.06.jpg
OK

etc...

aber ich stelle mir vor, dass es so funktionieren sollte:

PROCESSING 2012-01-17_07.05.jpg
# LONG PAUSE HERE (WHILE DOWNLOADING)
OK

PROCESSING 2012-01-17_07.06.jpg
# LONG PAUSE HERE (WHILE DOWNLOADING)
OK

PROCESSING 2012-01-17_07.06.jpg
# LONG PAUSE HERE (WHILE DOWNLOADING)
OK

etc...

Wie gesagt, ich habe gerade erst angefangen, Python zu lernen, und vielleicht mache ich hier einige Dinge völlig falsch (if str(s).startswith('226')????).Vielleicht kann ich das damit nicht erreichenftplib nur?Am Ende lauten meine Fragen:

Was mache ich hier falsch?:) :)
Wie erzeuge ich eine „richtige“ Ausgabe und gibt es eine Möglichkeit, beim Herunterladen einer Datei einen Status auszudrucken (zumindest eine Reihe von Punkten), zum Beispiel:

PROCESSING 2012-01-17_07.05.jpg
..........
OK

PROCESSING 2012-01-17_07.06.jpg
......
OK

PROCESSING 2012-01-17_07.06.jpg
...............
OK

etc...

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

retrybinary Blöcke, bis es abgeschlossen ist.Darum sehen Sie Processing ZZZ\n OK sofort, da es auftritt, nachdem der Aufruf von retrbinary abgeschlossen ist.

Wenn Sie drucken möchten . Für jeden Anruf müssen Sie dazu eine Rückruffunktion bereitstellen.Hier ist der Dokumentstring für retrbinary:

    """Retrieve data in binary mode.  A new port is created for you.

    Args:
      cmd: A RETR command.
      callback: A single parameter callable to be called on each
                block of data read.
      blocksize: The maximum number of bytes to read from the
                 socket at one time.  [default: 8192]
      rest: Passed to transfercmd().  [default: None]

    Returns:
      The response code.
    """

Sie müssen also einen anderen Rückruf bereitstellen, der sowohl die Datei schreibt als auch „.“ ausgibt.

import sys # At the top of your module.

# Modify your retrbinary    
ftp.retrbinary('RETR ' + h, lambda s: ftpfile.write(s) and sys.stdout.write('.'))

Möglicherweise müssen Sie diesen Codeausschnitt bearbeiten, aber er sollte Ihnen eine Vorstellung davon geben, was zu tun ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top