2012-01-25 23 views
3

私はPythonを学び、2つのディレクトリを同期させるためのコードを書こうとしています:1つはftpサーバにあり、もう1つはローカルディスクにあります。これまでのところ、私は、作業コードを書いたが、私はそれについての質問または2 :)pythonのftplibでディレクトリを同期する

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 

コードのこの作品は、2つのPythonのリストにする必要があります:ローカルディレクトリ内のファイルのリストや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のdocstringです:「」

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

関連する問題