Загрузка файла .pdf с FTP с использованием скрипта Python - PullRequest
1 голос
/ 22 декабря 2010

Извините, я очень новичок в Python.Я могу загружать файлы с FTP с помощью ftplib в Python, но это похоже на то, что я жестко прописываю имя, имя файла (R.pdf) и только для этой загрузки (R.pdf), есть ли способ загрузитьвсе файлы в FTP с расширением .PDF для моей локальной системы с использованием Python.Я могу сделать это в Shell, просто используя * .pdf

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Замените хост, пользователя и пароль своими учетными данными, и '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 () . Но я проверил, и это работает!

1 голос
/ 22 декабря 2010

У меня нет доступа к FTP серверу. Я могу попробовать это, но беглый взгляд на документацию показывает, что это невозможно.

Однако вы можете получить список файлов на удаленном конце с помощью команд dir или nlst и затем извлекать каждый файл в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...