Замените хост, пользователя и пароль своими учетными данными,
и 'public_html / soleil' с адресом каталога, в котором находятся файлы PDF, которые вы хотите загрузить,
в следующем коде и все должно быть в порядке, я думаю.
from ftplib import *
from os import listdir
from os.path import getsize
ftp_dt = FTP(host,user,password)
ftp_pi = FTP(host,user,password)
print '\n- Ouverture de connection et logging : OK'
ftp_dt.cwd('public_html/soleil')
ftp_pi.cwd('public_html/soleil')
def func(content, li = [0], la = [], si = [0], memname = ['']):
if name!=memname[0]:
memname[0],li[0:1],la[:],si[0:1] = name,[0],[],[0]
li[0] = li[0] + 1
si[0] = si[0] + len(content)
la.append(str(len(content)))
if li[0]%8==0:
print ' '.join(la) +\
' total: '+str(li[0])+' chunks, '+str(si[0])+' bytes'
la[:] = []
f.write(content)
li_files = []
for name in ftp_dt.nlst():
try:
ftp_dt.size(name)
if name not in ('.','..') and name[-4:]=='.pdf':
li_files.append(name)
except:
pass
if li_files:
for name in li_files:
print '\n- Downloading '+name
with open('E:\\PDF\\DOWNS\\'+name,'wb') as f:
ftp_pi.retrbinary('RETR '+name,func)
if getsize('E:\\PDF\\DOWNS\\'+name)==ftp_dt.size(name):
print ' OK ! Download of complete '+repr(name)+' SUCCEEDED'
else:
print ' FAILURE !! : '+name+' only partially downloaded'
else:
print '\nThere is no PDF file in this FTP directory'
ftp_dt.quit()
ftp_pi.quit()
Два соединения ftp_dt и ftp_pi определены для «Передача данных» и «Интерпретация протокола», поскольку протокол FTP основан на двух каналах, один для команд, а другой для. .... угадай что?
Функция func () используется как обратный вызов в функции retrbinary ()
Это может быть просто
def func(content):
f.write()
но я немного поиграл с возможностями стандартных переменных функции.
Одна вещь, которую я не очень хорошо понимаю: как этот код может работать, когда ссылка f в func () определяется только в тексте кода после определения func () . Но я проверил, и это работает!