Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python-FTP download all files in directory

Tags:

python

ftp

ftplib

I'm putting together a script to download all the files from a directory via FTP. So far I have managed to connect and fetch one file, but I cannot seem to make to work in batch (get all the files from the directory) Here is what I have so far:

from ftplib import FTP import os, sys, os.path  def handleDownload(block):     file.write(block)     print ".",  ddir='C:\\Data\\test\\' os.chdir(ddir) ftp = FTP('test1/server/')  print 'Logging in.' ftp.login('user1\\anon', 'pswrd20') directory = '\\data\\test\\'  print 'Changing to ' + directory ftp.cwd(directory) ftp.retrlines('LIST')  print 'Accessing files'  for subdir, dirs, files in os.walk(directory):     for file in files:          full_fname = os.path.join(root, fname);           print 'Opening local file '          ftp.retrbinary('RETR C:\\Data\\test\\' + fname,                        handleDownload,                        open(full_fname, 'wb'));         print 'Closing file ' + filename         file.close(); ftp.close() 

I bet you can tell that it does not do much when I run it, so any suggestions for improvements would be greatly appreciated.

like image 942
Sosti Avatar asked Mar 08 '11 10:03

Sosti


People also ask

How do I download a folder from an FTP server using python?

format(fn, curr, count) ftp. retrbinary('RETR ' + fn, open(fn, 'wb'). write) ftp. quit() print "download complete."


1 Answers

I've managed to crack this, so now posting the relevant bit of code for future visitors:

filenames = ftp.nlst() # get filenames within the directory print filenames  for filename in filenames:     local_filename = os.path.join('C:\\test\\', filename)     file = open(local_filename, 'wb')     ftp.retrbinary('RETR '+ filename, file.write)      file.close()  ftp.quit() # This is the “polite” way to close a connection 

This worked for me on Python 2.5, Windows XP.

like image 70
Sosti Avatar answered Sep 21 '22 23:09

Sosti