2013-07-05 5 views
0

Я пытаюсь выполнить скрипт кода с помощью python, чтобы оценить основной каталог этого ftp и архивировать его на локальный компьютер. Я не любительский кодер, а python для меня совершенно новый. То, что я получаю как ошибка прямо сейчас.Загрузка и архивирование ftp ftp ftp

File "C:\Users\Ali\Desktop\ftp_archiving_script.py", line 24, in <module> 
ftpDownload = ftp.retrbinary('RETR', filename) 

Код:

from ftplib import FTP 
import zipfile 
import os 
try: 
    import zlib 
    compression = zipfile.ZIP_DEFLATED 
except: 
    compression = zipfile.ZIP_STORED 
modes = { zipfile.ZIP_DEFLATED: "deflated", 
      zipfile.ZIP_STORED: "stored", 
    } 

#print "Logging in..." 
with FTP('xxx.xxx.xxx') as ftp: #hostname goes here 
    ftp.login('xxxx','xxxx') #user followed by pass 
    #print "changing to root directory" 
    ftp.mlsd('//') 
    #print "Accessing files" 
    filenames = [] 
    #print filenames 
    ftp.retrlines('NLST', filenames.append) 
    try: 
     for filename in filenames: 
      ftpDownload = ftp.retrbinary('RETR', filename) 
      with ZipFile(os.path.join('C:\\','DC_archive.zip'), 'w') as myzip: 
       myzip.write(ftpDownload, compress_type=compression) 
       myzip.close() 
    finally: 
     #print "closing" 
     ftp.close() 
    ftp.quit() 

Может кто-нибудь просветить меня на эту проблему.

Спасибо,

Update

try: 
    for filename in filenames: 
     with io.StringIO() as fObject: 
      ftp.retrbinary('RETR %s' %filename, fObject.write) 
      with ZipFile(os.path.join('C:\\','DC_archive.zip'), 'w') as myzip: 
       myzip.write(fObject, compress_type=compression) 
       myzip.close() 

обновленный TraceBack для @fals ... Кроме того, это использует код ниже, а не тот, у меня есть на самом верху.

Traceback (most recent call last): 
    File "C:\Users\Ali\Desktop\ftp_archive2.py", line 20, in <module> 
    ftpDownload = ftp.retrbinary('RETR ' + filename, f.write) 
    File "C:\Python33\lib\ftplib.py", line 424, in retrbinary 
    with self.transfercmd(cmd, rest) as conn: 
    File "C:\Python33\lib\ftplib.py", line 386, in transfercmd 
    return self.ntransfercmd(cmd, rest)[0] 
    File "C:\Python33\lib\ftplib.py", line 352, in ntransfercmd 
    resp = self.sendcmd(cmd) 
    File "C:\Python33\lib\ftplib.py", line 259, in sendcmd 
    return self.getresp() 
    File "C:\Python33\lib\ftplib.py", line 233, in getresp 
    raise error_perm(resp) 
ftplib.error_perm: 550 File not found 

ответ

1

Из документации Python для ftplib.retrbinary:

FTP.retrbinary (команда, вызов [, MaxBlocksize [отдохнули]])

Получить файл в двоичном режиме передачи. команда должна быть соответствующей командой RETR: 'RETR filename'. Функция обратного вызова - , вызываемая для каждого блока данных, с одним строковым аргументом , предоставляющим блок данных.

Нигде не указано, что он возвращает объект или строку, подобную файлу.

Вместо этого вы должны создать свой собственный обратный вызов для записи в файл-объект.

with open('my-downloaded-file', 'wb') as f: 
    ftp.retrbinary('RETR %s' % filename, f.write) 

Здесь f.write есть функция обратного вызова, которая будет получать данные, как она поступает из гнезда. Если вы не хотите сохранять файл на диск с помощью open, вы можете использовать модуль StringIO для имитации файла в памяти.

+0

Спасибо я попробую фиксируя его и посмотреть, что я получаю – madmanali93

+0

ту же ошибку. Теперь я обновлю код. Файл «C: \ Users \ Ali \ Desktop \ ftp_archiving_script.py», строка 23, в ftp.retrbinary ('RETR% s'% filename, fObject.write) – madmanali93

0

Попробуйте следующий код:

import ftplib 
from io import BytesIO 
import os 
import zipfile 

REMOTE_HOST = 'xxx.xxx.xxx' 
REMOTE_USER = '...' 
REMOTE_PASS = '...' 
REMOTE_DIR_PATH = '//' 
LOCAL_ZIP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop', 'DC_archive.zip') 

ftp = ftplib.FTP(REMOTE_HOST) 
try: 
    ftp.login(REMOTE_USER, REMOTE_PASS) 
    ftp.cwd(REMOTE_DIR_PATH) 
    filenames = ftp.nlst() 
    with zipfile.ZipFile(LOCAL_ZIP_PATH, 'w') as zf: 
     for filename in filenames: 
      with BytesIO() as f: 
       try: 
        ftpDownload = ftp.retrbinary('RETR ' + filename, f.write) 
        zf.writestr(filename, f.getvalue()) 
       except ftplib.Error as e: 
        print('Skip {}: {}'.format(filename, e)) 
finally: 
    ftp.quit() 
+0

Файл «C: \ Users \ Ali \ Desktop \ ftp_archive2.py ", строка 17, в с zipfile.ZipFile (LOCAL_ZIP_PATH, 'w') в виде zf: Это ошибка, которую я получаю с вашим кодом. – madmanali93

+0

@ madmanali93, Покажите мне полную трассировку или последнюю строку трассировки. – falsetru

+0

@ madmanali93, я думаю, вы отправили трассировку для AustinPhillips, а не для меня;). Там нет '... zipfile.ZipFile ....' в трассировке, которую вы опубликовали. – falsetru

Смежные вопросы