مزامنة الدلائل مع فتبليب بيثون
-
14-11-2019 - |
سؤال
أنا أتعلم بيثون ومحاولة كتابة رمز لمزامنة اثنين من الدلائل:واحد على خادم بروتوكول نقل الملفات ، والآخر على القرص المحلي.حتى الآن ، كتبت رمز العمل ولكن لدي سؤال أو اثنين حول هذا الموضوع :)
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
هذه القطعة من التعليمات البرمجية يجب أن تجعل قائمتين بيثون:قائمة الملفات في الدليل المحلي وقائمة الملفات في دليل بروتوكول نقل الملفات.بعد إزالة التكرارات من القوائم ، يجب أن يقوم البرنامج النصي بتنزيل الملفات المفقودة إلى الدليل المحلي الخاص بي.
في الوقت الحالي ، تقوم هذه القطعة من التعليمات البرمجية بما أحتاجه ، لكنني لاحظت أنه عندما أقوم بتشغيله ، فإن مخرجاتي لا تتصرف كما أتخيل أنها ستتصرف :)
على سبيل المثال ، يذهب الإخراج الحالي:
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...
كما قلت ، لقد بدأت للتو في تعلم بايثون ، وربما أفعل بعض الأشياء هنا بشكل خاطئ تماما (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...
شكرا جزيلا للمساعدة!
المحلول
إعادة المحاولة كتل ثنائية حتى تكتمل.هذا هو السبب في أنك ترى Processing ZZZ\n OK
على الفور ، لأنه يحدث بعد اكتمال الدعوة إلى ريتربيناري.
إذا كنت تريد الطباعة .
لكل مكالمة ، فأنت بحاجة إلى توفير وظيفة رد الاتصال للقيام بذلك.هنا هو دوسترينغ ل ريتربيناري:
"""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('.'))
قد تضطر إلى تحرير هذا المقتطف من التعليمات البرمجية ، ولكن يجب أن تعطيك فكرة عما يجب القيام به.