Domanda

Sto imparando Python e sto cercando di scrivere un codice per sincronizzare due directory: uno è sul server FTP, l'altro è sul mio disco locale. Finora, ho scritto un codice di lavoro ma ho una domanda o due a riguardo :)

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
.

Questo pezzo di codice dovrebbe creare due elenchi Python: un elenco di file nella directory locale e un elenco di file nella directory FTP. Dopo aver rimosso duplicati dagli elenchi, lo script dovrebbe scaricare i file "mancanti" nella mia directory locale.

Per ora, questo pezzo di codice sta facendo ciò di cui ho bisogno, ma ho notato che quando lo eseguo la mia output non agisce come immagino che avrebbe agito :)

Ad esempio, la mia uscita corrente va:

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

Ma immagino che dovrebbe funzionare in questo modo:

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

Come ho detto, ho appena iniziato ad imparare Python, e forse sto facendo qualche roba qui completamente sbagliata (if str(s).startswith('226') ????). Forse non riesco a raggiungere questo senso solo congeneracodicitagcode? Quindi alla fine le mie domande sono:

Cosa sto facendo di sbagliato qui? :)
. Come produrre un'uscita "corretta" ed esiste un modo per stampare un po 'di stato durante il download di un file (almeno una linea di punti), ad esempio:

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

Grazie mille per aiutare!

È stato utile?

Soluzione

Blocchi retrybinary fino a quando non è completa.Questo è il motivo per cui si vede immediatamente Processing ZZZ\n OK, perché si verifica dopo aver completato la chiamata a retricinary.

Se si desidera stampare . per ogni chiamata, è necessario fornire una funzione di callback per farlo.Ecco il docstring per 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.
    """
.

Quindi, è necessario fornire una callback diversa che scrive entrambi il file e stampa ". '

import sys # At the top of your module.

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

Potrebbe essere necessario modificare tale snippet di codice, ma dovrebbe darti un'idea di cosa fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top