2012-01-25 2 views
3

Я изучаю python и пытаюсь написать код для синхронизации двух каталогов: один на ftp-сервере, другой - на моем локальном диске. До сих пор я написал рабочий код, но у меня есть вопрос или два о нем :)Синхронизация каталогов с ftplib python

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 

Этот фрагмент кода должен сделать два питона списка: список файлов в локальном каталоге и список файлов в FTP каталог. После удаления дубликатов из списков сценарий должен загружать «отсутствующие» файлы в мой локальный каталог.

В настоящем время, этот кусок коды делает то, что мне нужно, но я заметил, что когда я запускаю это мой выход не действует, как я предполагаю, что это будет действовать :)

Например, мой выходной ток идет :

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

но я полагаю, что он должен работать так:

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

Как я уже сказал, я только начал изучать Python, и, может быть, я делаю некоторые вещи здесь совершенно неправильно (if str(s).startswith('226') ????). Может быть, я не могу добиться этого только с ftplib? Поэтому в конце мои вопросы:

Что я здесь делаю неправильно? :)
Как производить «правильный» выход и есть способ напечатать какое-то статус при загрузке файла (по крайней мере, линии из точек), например:

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

Большого спасибо за помощь !

ответ

3

retrybinary блоки до его завершения. Вот почему вы сразу видите Processing ZZZ\n OK, потому что это происходит после завершения вызова для retrbinary.

Если вы хотите напечатать . для каждого вызова, вам необходимо предоставить функцию обратного вызова для этого. вот для 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. 
    """ 

Таким образом, вы должны предоставить другую функцию обратного вызова, что и записывает файл и печатает «»

import sys # At the top of your module. 

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

Вы, возможно, придется изменить этот фрагмент кода, но это должно дать вам представление о том, что делать.

+0

Большое спасибо! :) – errata

Смежные вопросы