2016-07-31 2 views
1

Попытка собрать мою первую полезную программу Python с целью автоматизации моих резервных копий на сайте. Я просмотрел учебник о том, как загрузить один файл, но когда дело доходит до папки, я менее понятен. Я хотел бы создать локальную резервную копию всей папки с моего сайта через FTP.Загрузить весь каталог через FTP с помощью Python

До сих пор я пришел с этим, с некоторой помощью от this question:

from ftplib import FTP 
import os 

ftp=FTP("ftp.xxxxxxxxx.com") 
ftp.login("xxxxxxxxxxx","xxxxxxxxxx") #login to FTP account 
print "Successfully logged in" 
ftp.cwd("public_html") #change working directory to \public_html\ 
filenames = ftp.nlst() #create variable to store contents of \public_html\ 

os.makedirs("C:\\Users\\xxxxxx\\Desktop\\Backup")#create local backup directory 
os.chdir("C:\\Users\\xxxxxx\\Desktop\\Backup")#change working directory to local backup directory 

#for loop to download each file individually 
for a in filenames: 
    ftp.retrbinary("RETR " + a, file.write) 
    file.close() 


ftp.close() #CLOSE THE FTP CONNECTION 
print "FTP connection closed. Goodbye" 

Я неохотно, чтобы запустить его, как я не хочу, чтобы создать проблему на моем сайте, если это не так. Следует отметить, что расширение файла локального файла & должно соответствовать файлу удаляемого файла.

Любые рекомендации оценены!

+0

Возможный дубликат [Загрузка Дерево каталогов с FTPLIB] (http://stackoverflow.com/questions/2605119/downloading-a-directory-tree-with-ftplib) –

ответ

2

Вам не нужно менять рабочий каталог, просто сохраняйте свои файлы по намеченному пути.

И для загрузки файлов в первую очередь необходимо, чтобы получить список имен файлов:

file_list = [] 
ftp.retrlines('LIST', lambda x: file_list.append(x.split())) 

Затем отделить файлы из каталогов, и загрузить их:

for info in file_list: 
    ls_type, name = info[0], info[-1] 
    if not ls_type.startswith('d'): 
     with open(name, 'wb') as f: 
      ftp.retrbinary('RETR {}'.format(f), f.write) 
+1

В последней строке 'ftp.retrbinary ('RETR {}'. fromat (f), f.write) 'Я думаю, вы имеете в виду' .format (f) ', а не' fromat (f) ' – theeastcoastwest

+0

@Frank Yep, благодаря fo r комментарий. – Kasramvd

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