PythonのFTPLIBを使用してディレクトリを同期させる
-
14-11-2019 - |
質問
私はPythonを学んで、2つのディレクトリを同期するためのコードを書き込もうとしています.1つはFTPサーバー上にあり、もう1つはローカルディスク上です。これまでのところ、私は作業コードを書きましたが、私はそれについて質問または2つを持っています:)
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...
.
助けてくれてありがとう!
解決
完了するまでの再rybinaryブロック。これが、RetSbinaryの呼び出しが完了した後に発生するため、Processing ZZZ\n OK
が表示される理由です。
呼び出しごとに.
を印刷したい場合は、これを行うためのコールバック関数を指定する必要があります。これがRetsbinaryの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('.'))
.
そのコードのスニペットを編集する必要があるかもしれませんが、それはあなたに何をすべきかという考えを与えるべきです。