Python FTP

2025年1月5日 | 阅读6分钟

Python 通过 ftplib 模块内置支持文件传输协议 (FTP)。FTP 是一种用于在计算机之间通过网络传输文件的标准网络协议。在本教程中,我们将探讨如何使用 ftplib 模块执行各种 FTP 任务,例如连接到 FTP 服务器、列出文件和目录、上传和下载文件等。

FTP 简介

FTP(文件传输协议)是一种用于在计算机网络中的客户端和服务器之间传输计算机文件的标准网络协议。FTP 基于客户端-服务器模型架构,在客户端和服务器之间使用单独的控制和数据连接。

ftplib 模块

Python 的 ftplib 模块允许您连接到 FTP 服务器。ftplib 模块提供了一系列方法来处理各种 FTP 任务,例如连接到 FTP 服务器、列出目录、传输和下载文件。

FTP 库

虽然 ftplib 模块是 Python 中 FTP 任务的标准且可靠的选择,但也有其他可用的库提供了附加功能或更现代的方法。

  • ftputil:一个高级、用户友好的库,它包装了 ftplib 并提供了其他功能,例如递归文件传输、文件般的接口等等。
  • pysftp:一个用于处理 SFTP(安全文件传输协议)的库,SFTP 是 FTP 的更安全替代方案。它为 SFTP 操作提供了 Pythonic 接口。
  • Fabric:一个高级 Python 库,可简化通过 SSH 执行 shell 命令和文件传输,包括对 SFTP 的支持。

这些替代方案可能提供附加功能、更好的性能或更直观的接口,具体取决于您的具体需求。

设置 FTP 服务器

出于演示目的,您需要设置一个本地 FTP 服务器。在类 Unix 系统上,您可以使用 vsftpd,而在 Windows 上,您可以使用 FileZilla Server 等软件。

基本 FTP 操作

连接到 FTP 服务器

要连接到 FTP 服务器,您将使用 ftplib 模块中的 FTP 类。以下是连接到 FTP 服务器的基本指南。

输出

220 Welcome to Example FTP Server

列出文件和目录

连接后,您可以列出服务器上的文件和目录。

输出

drwxr-xr-x    2 1001     1001         4096 Apr 01 12:34 directory1
-rw-r--r--    1 1001     1001         1234 Mar 25 09:12 file1.txt
-rw-r--r--    1 1001     1001         4321 Mar 25 10:22 file2.txt

更改目录

要在 FTP 服务器上的目录之间导航。

输出

Current directory: /directory1

下载文件

要从 FTP 服务器下载文件,请使用 retrbinary 方法。

输出

# here, the file with the filename: file1.txt will be downloaded and saved locally

上传文件

要将文件上传到 FTP 服务器,请使用 storbinary 方法。

输出

# here, the file with the filename: file_to_upload.txt will be uploaded to the server

高级 FTP 操作

处理目录

您可以使用 mkd 和 rmd 方法分别在 FTP 服务器上创建和删除目录。

创建一个目录

输出

# here, the file with the filename: new_directory will be created on the server

删除目录

输出

# here, the file with the filename: new_directory will be removed from the server

删除文件

要从 FTP 服务器删除文件,请使用 erase 方法。

输出

# here, the file with the filename: file_to_delete.txt will be deleted from the server

重命名文件

要重命名 FTP 服务器上的文件,请使用 rename 方法。

输出

# here, the file old_filename.txt will be renamed to new_filename.txt on the server

处理 FTP 错误

ftplib 模块为不同的 FTP 错误引发各种异常,例如,权限错误使用 error_perm,临时错误使用 error_temp。您可以使用 try-except 块来处理这些异常。

输出

FTP error: 550 Failed to change directory.

被动模式和主动模式

FTP 可以以两种模式运行:被动模式和主动模式。默认情况下,ftplib 使用被动模式,但如果需要,您可以切换到主动模式。

切换到主动模式

下载和上传大文件

处理大文件时,分块下载和上传文件很有效。retrbinary 和 storbinary 方法允许指定分块传输的大小。

分块下载

分块上传

记录 FTP 事务

出于调试和日志记录目的,您可以启用 ftplib 的调试输出。

启用调试输出

输出

*cmd* 'USER username'
*resp* '331 Password required for username'
*cmd* 'PASS password'
*resp* '230 User username logged in'
*cmd* 'QUIT'
*resp* '221 Goodbye.'

安全 FTP (FTPS)

对于安全的文件传输,请使用 ftplib.FTP_TLS,它增加了对通过 TLS (FTPS) 的 FTP 的支持。

通过 FTPS 连接

递归列出和传输文件

有时,您可能需要递归地列出或传输文件和目录。ftplib 模块不提供对递归的内置支持,但您可以使用额外的 Python 代码来实现它。

list_files_recursive 函数从给定路径开始递归列出 FTP 服务器上的所有文件。download_files_recursive 函数将 FTP 服务器上的所有文件和目录递归下载到指定的本地目录。

这些示例演示了 ftplib 模块的灵活性以及如何扩展以处理更复杂的情况。

结论

我们探讨了如何使用 Python 的 ftplib 模块与 FTP 服务器进行通信。我们首先连接到 FTP 服务器并登录。然后,我们涵盖了诸如列出文件和目录、更改目录、下载文件和上传文件等基本操作。此外,我们深入研究了更高级的任务,例如创建和删除目录、删除和重命名文件以及使用适当的异常处理来处理错误。我们还讨论了被动模式和主动模式之间的区别,分块处理大文件的重要性,以及启用调试日志记录以进行故障排除的好处。最后,我们讨论了使用 FTPS 进行加密文件传输来保护 FTP 事务。有了这些工具和技术,您就可以在 Python 应用程序中有效地管理 FTP 操作。