:mod:`!ftplib` --- FTP protocol client
======================================

.. module:: ftplib
   :synopsis: FTP protocol client (requires sockets).

**Source code:** :source:`Lib/ftplib.py`

.. index::
   pair: FTP; protocol
   single: FTP; ftplib (standard module)

--------------

This module defines the class :class:`FTP` and a few related items. The
:class:`FTP` class implements the client side of the FTP protocol.  You can use
this to write Python programs that perform a variety of automated FTP jobs, such
as mirroring other FTP servers.  It is also used by the module
:mod:`urllib.request` to handle URLs that use FTP.  For more information on FTP
(File Transfer Protocol), see internet :rfc:`959`.

The default encoding is UTF-8, following :rfc:`2640`.

.. include:: ../includes/wasm-notavail.rst

Here's a sample session using the :mod:`ftplib` module::

   >>> from ftplib import FTP
   >>> ftp = FTP('ftp.us.debian.org')  # connect to host, default port
   >>> ftp.login()                     # user anonymous, passwd anonymous@
   '230 Login successful.'
   >>> ftp.cwd('debian')               # change into "debian" directory
   '250 Directory successfully changed.'
   >>> ftp.retrlines('LIST')           # list directory contents
   -rw-rw-r--    1 1176     1176         1063 Jun 15 10:18 README
   ...
   drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
   drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
   drwxr-xr-x    3 1176     1176         4096 Oct 10  2012 tools
   '226 Directory send OK.'
   >>> with open('README', 'wb') as fp:
   >>>     ftp.retrbinary('RETR README', fp.write)
   '226 Transfer complete.'
   >>> ftp.quit()
   '221 Goodbye.'


.. _ftplib-reference:

Reference
---------

.. _ftp-objects:

FTP objects
^^^^^^^^^^^

.. Use substitutions for some param docs so we don't need to repeat them
   in multiple places.

.. |param_doc_user| replace::
   The username to log in with (default: ``'anonymous'``).

.. |param_doc_passwd| replace::
   The password to use when logging in.
   If not given, and if *passwd* is the empty string or ``"-"``,
   a password will be automatically generated.

.. Ideally, we'd like to use the :rfc: directive, but Sphinx will not allow it.

.. |param_doc_acct| replace::
   Account information to be used for the ``ACCT`` FTP command.
   Few systems implement this.
   See `RFC-959 <https://datatracker.ietf.org/doc/html/rfc959.html>`__
   for more details.

.. |param_doc_source_address| replace::
   A 2-tuple ``(host, port)`` for the socket to bind to as its
   source address before connecting.

.. |param_doc_encoding| replace::
   The encoding for directories and filenames (default: ``'utf-8'``).

.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, \
               source_address=None, *, encoding='utf-8')

   Return a new instance of the :class:`FTP` class.

   :param str host:
      The hostname to connect to.
      If given, :code:`connect(host)` is implicitly called by the constructor.

   :param str user:
      |param_doc_user|
      If given, :code:`login(host, passwd, acct)` is implicitly called
      by the constructor.

   :param str passwd:
      |param_doc_passwd|

   :param str acct:
      |param_doc_acct|

   :param timeout:
      A timeout in seconds for blocking operations like :meth:`connect`
      (default: the global default timeout setting).
   :type timeout: float | None

   :param source_address:
      |param_doc_source_address|
   :type source_address: tuple | None

   :param str encoding:
      |param_doc_encoding|

   The :class:`FTP` class supports the :keyword:`with` statement, e.g.:

    >>> from ftplib import FTP
    >>> with FTP("ftp1.at.proftpd.org") as ftp:
    ...     ftp.login()
    ...     ftp.dir()
    ... # doctest: +SKIP
    '230 Anonymous login ok, restrictions apply.'
    dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
    dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
    dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
    dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
    >>>

   .. versionchanged:: 3.2
      Support for the :keyword:`with` statement was added.

   .. versionchanged:: 3.3
      *source_address* parameter was added.

   .. versionchanged:: 3.9
      If the *timeout* parameter is set to be zero, it will raise a
      :class:`ValueError` to prevent the creation of a non-blocking socket.
      The *encoding* parameter was added, and the default was changed from
      Latin-1 to UTF-8 to follow :rfc:`2640`.

   Several :class:`!FTP` methods are available in two flavors:
   one for handling text files and another for binary files.
   The methods are named for the command which is used followed by
   ``lines`` for the text version or ``binary`` for the binary version.

   :class:`FTP` instances have the following methods:

   .. method:: FTP.set_debuglevel(level)

      Set the instance's debugging level as an :class:`int`.
      This controls the amount of debugging output printed.
      The debug levels are:

      * ``0`` (default): No debug output.
      * ``1``: Produce a moderate amount of debug output,
        generally a single line per request.
      * ``2`` or higher: Produce the maximum amount of debugging output,
        logging each line sent and received on the control connection.

   .. method:: FTP.connect(host='', port=0, timeout=None, source_address=None)

      Connect to the given host and port.
      This function should be called only once for each instance;
      it should not be called if a *host* argument was given
      when the :class:`FTP` instance was created.
      All other :class:`!FTP` methods can only be called
      after a connection has successfully been made.

      :param str host:
         The host to connect to.

      :param int port:
         The TCP port to connect to (default: ``21``,
         as specified by the FTP protocol specification).
         It is rarely needed to specify a different port number.

      :param timeout:
         A timeout in seconds for the connection attempt
         (default: the global default timeout setting).
      :type timeout: float | None

      :param source_address:
         |param_doc_source_address|
      :type source_address: tuple | None

      .. audit-event:: ftplib.connect self,host,port ftplib.FTP.connect

      .. versionchanged:: 3.3
         *source_address* parameter was added.


   .. method:: FTP.getwelcome()

      Return the welcome message sent by the server in reply to the initial
      connection.  (This message sometimes contains disclaimers or help information
      that may be relevant to the user.)


   .. method:: FTP.login(user='anonymous', passwd='', acct='')

      Log on to the connected FTP server.
      This function should be called only once for each instance,
      after a connection has been established;
      it should not be called if the *host* and *user* arguments were given
      when the :class:`FTP` instance was created.
      Most FTP commands are only allowed after the client has logged in.

      :param str user:
         |param_doc_user|

      :param str passwd:
         |param_doc_passwd|

      :param str acct:
         |param_doc_acct|


   .. method:: FTP.abort()

      Abort a file transfer that is in progress.  Using this does not always work, but
      it's worth a try.


   .. method:: FTP.sendcmd(cmd)

      Send a simple command string to the server and return the response string.

      .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.sendcmd


   .. method:: FTP.voidcmd(cmd)

      Send a simple command string to the server and handle the response.  Return
      the response string if the response code corresponds to success (codes in
      the range 200--299).  Raise :exc:`error_reply` otherwise.

      .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.voidcmd


   .. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None)

      Retrieve a file in binary transfer mode.

      :param str cmd:
        An appropriate ``RETR`` command: :samp:`"RETR {filename}"`.

      :param callback:
         A single parameter callable that is called
         for each block of data received,
         with its single argument being the data as :class:`bytes`.
      :type callback: :term:`callable`

      :param int blocksize:
         The maximum chunk size to read on the low-level
         :class:`~socket.socket` object created to do the actual transfer.
         This also corresponds to the largest size of data
         that will be passed to *callback*.
         Defaults to ``8192``.

      :param int rest:
         A ``REST`` command to be sent to the server.
         See the documentation for the *rest* parameter of the :meth:`transfercmd` method.


   .. method:: FTP.retrlines(cmd, callback=None)

      Retrieve a file or directory listing in the encoding specified by the
      *encoding* parameter at initialization.
      *cmd* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or
      a command such as ``LIST`` or ``NLST`` (usually just the string ``'LIST'``).
      ``LIST`` retrieves a list of files and information about those files.
      ``NLST`` retrieves a list of file names.
      The *callback* function is called for each line with a string argument
      containing the line with the trailing CRLF stripped.  The default *callback*
      prints the line to :data:`sys.stdout`.


   .. method:: FTP.set_pasv(val)

      Enable "passive" mode if *val* is true, otherwise disable passive mode.
      Passive mode is on by default.


   .. method:: FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None)

      Store a file in binary transfer mode.

      :param str cmd:
        An appropriate ``STOR`` command: :samp:`"STOR {filename}"`.

      :param fp:
         A file object (opened in binary mode) which is read until EOF,
         using its :meth:`~io.RawIOBase.read` method in blocks of size *blocksize*
         to provide the data to be stored.
      :type fp: :term:`file object`

      :param int blocksize:
         The read block size.
         Defaults to ``8192``.

      :param callback:
         A single parameter callable that is called
         for each block of data sent,
         with its single argument being the data as :class:`bytes`.
      :type callback: :term:`callable`

      :param int rest:
         A ``REST`` command to be sent to the server.
         See the documentation for the *rest* parameter of the :meth:`transfercmd` method.

      .. versionchanged:: 3.2
         The *rest* parameter was added.


   .. method:: FTP.storlines(cmd, fp, callback=None)

      Store a file in line mode.  *cmd* should be an appropriate
      ``STOR`` command (see :meth:`storbinary`).  Lines are read until EOF from the
      :term:`file object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline`
      method to provide the data to be stored.  *callback* is an optional single
      parameter callable that is called on each line after it is sent.


   .. method:: FTP.transfercmd(cmd, rest=None)

      Initiate a transfer over the data connection.  If the transfer is active, send an
      ``EPRT`` or  ``PORT`` command and the transfer command specified by *cmd*, and
      accept the connection.  If the server is passive, send an ``EPSV`` or ``PASV``
      command, connect to it, and start the transfer command.  Either way, return the
      socket for the connection.

      If optional *rest* is given, a ``REST`` command is sent to the server, passing
      *rest* as an argument.  *rest* is usually a byte offset into the requested file,
      telling the server to restart sending the file's bytes at the requested offset,
      skipping over the initial bytes.  Note however that the :meth:`transfercmd`
      method converts *rest* to a string with the *encoding* parameter specified
      at initialization, but no check is performed on the string's contents.  If the
      server does not recognize the ``REST`` command, an :exc:`error_reply` exception
      will be raised.  If this happens, simply call :meth:`transfercmd` without a
      *rest* argument.


   .. method:: FTP.ntransfercmd(cmd, rest=None)

      Like :meth:`transfercmd`, but returns a tuple of the data connection and the
      expected size of the data.  If the expected size could not be computed, ``None``
      will be returned as the expected size.  *cmd* and *rest* means the same thing as
      in :meth:`transfercmd`.


   .. method:: FTP.mlsd(path="", facts=[])

      List a directory in a standardized format by using ``MLSD`` command
      (:rfc:`3659`).  If *path* is omitted the current directory is assumed.
      *facts* is a list of strings representing the type of information desired
      (e.g. ``["type", "size", "perm"]``).  Return a generator object yielding a
      tuple of two elements for every file found in path.  First element is the
      file name, the second one is a dictionary containing facts about the file
      name.  Content of this dictionary might be limited by the *facts* argument
      but server is not guaranteed to return all requested facts.

      .. versionadded:: 3.3


   .. method:: FTP.nlst(argument[, ...])

      Return a list of file names as returned by the ``NLST`` command.  The
      optional *argument* is a directory to list (default is the current server
      directory).  Multiple arguments can be used to pass non-standard options to
      the ``NLST`` command.

      .. note:: If your server supports the command, :meth:`mlsd` offers a better API.


   .. method:: FTP.dir(argument[, ...])

      Produce a directory listing as returned by the ``LIST`` command, printing it to
      standard output.  The optional *argument* is a directory to list (default is the
      current server directory).  Multiple arguments can be used to pass non-standard
      options to the ``LIST`` command.  If the last argument is a function, it is used
      as a *callback* function as for :meth:`retrlines`; the default prints to
      :data:`sys.stdout`.  This method returns ``None``.

      .. note:: If your server supports the command, :meth:`mlsd` offers a better API.


   .. method:: FTP.rename(fromname, toname)

      Rename file *fromname* on the server to *toname*.


   .. method:: FTP.delete(filename)

      Remove the file named *filename* from the server.  If successful, returns the
      text of the response, otherwise raises :exc:`error_perm` on permission errors or
      :exc:`error_reply` on other errors.


   .. method:: FTP.cwd(pathname)

      Set the current directory on the server.


   .. method:: FTP.mkd(pathname)

      Create a new directory on the server.


   .. method:: FTP.pwd()

      Return the pathname of the current directory on the server.


   .. method:: FTP.rmd(dirname)

      Remove the directory named *dirname* on the server.


   .. method:: FTP.size(filename)

      Request the size of the file named *filename* on the server.  On success, the
      size of the file is returned as an integer, otherwise ``None`` is returned.
      Note that the ``SIZE`` command is not  standardized, but is supported by many
      common server implementations.


   .. method:: FTP.quit()

      Send a ``QUIT`` command to the server and close the connection. This is the
      "polite" way to close a connection, but it may raise an exception if the server
      responds with an error to the ``QUIT`` command.  This implies a call to the
      :meth:`close` method which renders the :class:`FTP` instance useless for
      subsequent calls (see below).


   .. method:: FTP.close()

      Close the connection unilaterally.  This should not be applied to an already
      closed connection such as after a successful call to :meth:`~FTP.quit`.
      After this call the :class:`FTP` instance should not be used any more (after
      a call to :meth:`close` or :meth:`~FTP.quit` you cannot reopen the
      connection by issuing another :meth:`login` method).


FTP_TLS objects
^^^^^^^^^^^^^^^

.. class:: FTP_TLS(host='', user='', passwd='', acct='', *, context=None, \
                   timeout=None, source_address=None, encoding='utf-8')

   An :class:`FTP` subclass which adds TLS support to FTP as described in
   :rfc:`4217`.
   Connect to port 21 implicitly securing the FTP control connection
   before authenticating.

   .. note::
      The user must explicitly secure the data connection
      by calling the :meth:`prot_p` method.

   :param str host:
      The hostname to connect to.
      If given, :code:`connect(host)` is implicitly called by the constructor.

   :param str user:
      |param_doc_user|
      If given, :code:`login(host, passwd, acct)` is implicitly called
      by the constructor.

   :param str passwd:
      |param_doc_passwd|

   :param str acct:
      |param_doc_acct|

   :param context:
      An SSL context object which allows bundling SSL configuration options,
      certificates and private keys into a single, potentially long-lived,
      structure.
      Please read :ref:`ssl-security` for best practices.
   :type context: :class:`ssl.SSLContext`

   :param timeout:
      A timeout in seconds for blocking operations like :meth:`~FTP.connect`
      (default: the global default timeout setting).
   :type timeout: float | None

   :param source_address:
      |param_doc_source_address|
   :type source_address: tuple | None

   :param str encoding:
      |param_doc_encoding|

   .. versionadded:: 3.2

   .. versionchanged:: 3.3
      Added the *source_address* parameter.

   .. versionchanged:: 3.4
      The class now supports hostname check with
      :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see
      :const:`ssl.HAS_SNI`).

   .. versionchanged:: 3.9
      If the *timeout* parameter is set to be zero, it will raise a
      :class:`ValueError` to prevent the creation of a non-blocking socket.
      The *encoding* parameter was added, and the default was changed from
      Latin-1 to UTF-8 to follow :rfc:`2640`.

   .. versionchanged:: 3.12
      The deprecated *keyfile* and *certfile* parameters have been removed.

   Here's a sample session using the :class:`FTP_TLS` class::

      >>> ftps = FTP_TLS('ftp.pureftpd.org')
      >>> ftps.login()
      '230 Anonymous user logged in'
      >>> ftps.prot_p()
      '200 Data protection level set to "private"'
      >>> ftps.nlst()
      ['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']

   :class:`!FTP_TLS` class inherits from :class:`FTP`,
   defining these additional methods and attributes:

   .. method:: FTP_TLS.auth()

      Set up a secure control connection by using TLS.

      .. versionchanged:: 3.4
         The method now supports hostname check with
         :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see
         :const:`ssl.HAS_SNI`).

   .. method:: FTP_TLS.ccc()

      Revert control channel back to plaintext.  This can be useful to take
      advantage of firewalls that know how to handle NAT with non-secure FTP
      without opening fixed ports.

      .. versionadded:: 3.3

   .. method:: FTP_TLS.prot_p()

      Set up secure data connection by using TLS.

   .. method:: FTP_TLS.prot_c()

      Set up clear text data connection.


Module variables
^^^^^^^^^^^^^^^^

.. exception:: error_reply

   Exception raised when an unexpected reply is received from the server.


.. exception:: error_temp

   Exception raised when an error code signifying a temporary error (response
   codes in the range 400--499) is received.


.. exception:: error_perm

   Exception raised when an error code signifying a permanent error (response
   codes in the range 500--599) is received.


.. exception:: error_proto

   Exception raised when a reply is received from the server that does not fit
   the response specifications of the File Transfer Protocol, i.e. begin with a
   digit in the range 1--5.


.. data:: all_errors

   The set of all exceptions (as a tuple) that methods of :class:`FTP`
   instances may raise as a result of problems with the FTP connection (as
   opposed to programming errors made by the caller).  This set includes the
   four exceptions listed above as well as :exc:`OSError` and :exc:`EOFError`.


.. seealso::

   Module :mod:`netrc`
      Parser for the :file:`.netrc` file format.  The file :file:`.netrc` is
      typically used by FTP clients to load user authentication information
      before prompting the user.
