سؤال

أنا أتعلم بيثون ومحاولة كتابة رمز لمزامنة اثنين من الدلائل:واحد على خادم بروتوكول نقل الملفات ، والآخر على القرص المحلي.حتى الآن ، كتبت رمز العمل ولكن لدي سؤال أو اثنين حول هذا الموضوع :)

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('.'))

قد تضطر إلى تحرير هذا المقتطف من التعليمات البرمجية ، ولكن يجب أن تعطيك فكرة عما يجب القيام به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top