Reading Time: 1 minutes
ftplib in Python
ftplib in Python: Python's standard library module ftplib enables users to carry out operations on a remote system using File Transfer Protocol. You can transfer files, fetch directory listing, create directories etc. on the connected system. Following are a few chosen operations, you can view the complete list of functionality that the ftplib offers by visiting its documentation.
Creating an FTP connection
>>> import ftplib
>>> ftpConnection = ftplib.FTP()
>>> ftpConnection.connect('ftp.yourDomainHere.com')
>>> ftpConnection.login('yourUsername', 'yourPassword')
# The connect() method returns a welcome message from FTP server with status code 220 if connection successful. If unsuccessful, it raises socket.gaierror saying '[Errno 11001] getaddrinfo failed'.
# The login() method returns a success message with status code 230 if credentials are correct. If unsuccessful, it raises ftplib.error_perm saying '530 Login incorrect'
# Alternatively, you can provide this information to the constructor of the FTP class, in order to reduce method calls.
>>> ftpConnection3 = ftplib.FTP('ftp.yourDomainHere.com', 'yourUsername', 'yourPassword')
Getting present working directory
>>> ftpConnection.pwd()
Retrieving directory listing
>>> ftpConnection.dir()
# The dir() method gives long form of constituents of the current directory with information such as file permissions, created by, creation date & time etc.
# Alternatively, you can use th nlst() method.
>>> ftpConnection.nlst()
# The nlst() method returns a list of directories & files in the current directory. To view contents of a subdirectory, enter the name of subdirectory as an argument e.g. ftpConnection.nlst('subDirectoryOne').
# Alternatively, you can use the retrlines() method. The retrlines() method lists directories with either 'NLST' or 'LIST' as its argument.
>>> ftpConnection.retrlines('LIST') # output similar to dir()
>>> ftpConnection.retrlines('NLST') # output similar to nlst()
Changing current working directory
>>> ftpConnection.cwd('subDirectoryOne')
# To move up a directory, enter two dots in the arguments.
>>> ftpConnection.cwd('..')
Deleting a file
>>> ftpConnection.delete('fileName')
Creating a directory
>>> ftpConnection.mkd('subDirectoryOneUnderSubDirectoryOne')
Removing a file/directory
ftpConnection.rmd('subDirectoryOneUnderSubDirectoryOne')
# The above works fine if the directory is empty. If it is not empty, you will receive an error saying the directory is not empty. In such a case, use the following code snippet to remove a non-empty directory.
Emptying a non-empty directory
# Navigate to the directory containing the non-empty directory, then call the following function.
def emptyNonEmptyDirectory():
files = ftpConnection.nlst()
for file in files:
try: # If file is not a directory
ftpConnection.delete(file)
except: # If file is a directory
try: # if directory is empty
ftpConnection.rmd(file)
except: # if directory is not empty
ftpConnection.cwd(file)
emptyNonEmptyDirectory()
ftpConnection.cwd('..')
ftpConnection.rmd(file)
# Now that the directory is empty, call the rmd() method on it to delete it.
Renaming a directory
>>> ftpConnection.rename('subDirectoryOne', 'subDirectoryTwo')
Downloading a file
# Navigate to directory on remote system where you file is placed. Then, execute the following to download the file.
>>> ftpConnection.retrbinary('RETR fileNameOnRemoteSystem.txt', open(r'fullPathToNewFileOnLocalSystemIncludingNewFileName', 'wb'))
Uploading a file
# Navigate to directory where you want to place the file. Then execute the following.
>>> ftpConnection.storbinary('STOR fileNameOnRemoteSystem', open(r'fullPathToFileOnLocalSystemIncludingFileName', 'rb'))
Uploading a folder
# Contents of dirOne
|subDirOne
|--subDirOneFileOne.txt
|--subDirOneFileTwo.txt
|subDirTwo
|fileOne.txt
|fileTwo.txt
directoryToMove = r'pathToDirectoryOnLocalSystem'
def uploadDirectory(pathOfDirectoryToMove):
import os
files = os.listdir(pathOfDirectoryToMove) # ['fileOne.txt', 'fileTwo.txt', 'subDirOne', 'subDirTwo']
os.chdir(pathOfDirectoryToMove) # changes current working directory to pathTo_dirOne
for file in files:
# if file is not a directory, then transfer it.
if os.path.isfile(pathOfDirectoryToMove + r'\{}'.format(file)):
fileHandler = open(file, 'rb')
ftpConnection.storbinary('STOR {}'.format(file), fileHandler)
fileHandler.close()
# if file is a directory, make a directory by the same name on the remote system, access it, and call uploadDirectory() again to process its contents.
elif os.path.isdir(pathOfDirectoryToMove + r'\{}'.format(file)):
ftpConnection.mkd(file)
ftpConnection.cwd(file)
uploadDirectory(pathOfDirectoryToMove + r'\{}'.format(file))
ftpConnection.cwd('..')
os.chdir('..') # go back to parent directory
uploadDirectory(directoryToMove)
Executing FTP commands
# The sendcmd() method allows you to execute FTP commands and receive a response string from the server. A list of valid FTP commands can be viewed from https://en.wikipedia.org/wiki/List_of_FTP_commands or by executing ftpConnection.sendcmd('HELP'). A couple of usage examples:
>>> ftpConnection.sendcmd('PWD')
>>> ftpConnection.sendcmd('CDUP')
>>> ftpConnection.sendcmd('QUIT')
Closing an FTP connection
>>> ftpConnection.close()







