061. 编写一个函数,实现简单的FTP客户端功能

在 Python 中,可以使用 ftplib 模块来实现简单的 FTP 客户端功能。以下是一个示例代码,展示如何编写一个简单的 FTP 客户端函数,支持登录、上传文件、下载文件和列出目录内容等基本功能。

示例代码

from ftplib import FTP

def ftp_client(host, port=21, username="anonymous", password=""):
    """
    简单的 FTP 客户端函数

    :param host: FTP 服务器地址
    :param port: FTP 服务器端口,默认为 21
    :param username: 用户名,默认为匿名用户
    :param password: 密码,默认为空
    :return: FTP 对象
    """
    try:
        # 创建 FTP 对象并连接到服务器
        ftp = FTP()
        ftp.connect(host, port)
        ftp.login(username, password)
        print(f"成功连接到 {host}:{port}")
        return ftp
    except Exception as e:
        print(f"连接失败:{e}")
        return None

def list_directory(ftp):
    """
    列出当前目录的内容

    :param ftp: FTP 对象
    """
    try:
        print("当前目录内容:")
        ftp.dir()
    except Exception as e:
        print(f"列出目录失败:{e}")

def download_file(ftp, remote_file, local_file):
    """
    从 FTP 服务器下载文件

    :param ftp: FTP 对象
    :param remote_file: 远程文件路径
    :param local_file: 本地文件路径
    """
    try:
        with open(local_file, 'wb') as f:
            ftp.retrbinary(f'RETR {remote_file}', f.write)
        print(f"文件 {remote_file} 已下载到 {local_file}")
    except Exception as e:
        print(f"下载文件失败:{e}")

def upload_file(ftp, local_file, remote_file):
    """
    上传文件到 FTP 服务器

    :param ftp: FTP 对象
    :param local_file: 本地文件路径
    :param remote_file: 远程文件路径
    """
    try:
        with open(local_file, 'rb') as f:
            ftp.storbinary(f'STOR {remote_file}', f)
        print(f"文件 {local_file} 已上传到 {remote_file}")
    except Exception as e:
        print(f"上传文件失败:{e}")

def close_ftp(ftp):
    """
    关闭 FTP 连接

    :param ftp: FTP 对象
    """
    try:
        ftp.quit()
        print("FTP 连接已关闭")
    except Exception as e:
        print(f"关闭连接失败:{e}")

# 示例用法
if __name__ == "__main__":
    host = "ftp.example.com"  # 替换为你的 FTP 服务器地址
    port = 21  # FTP 服务器端口
    username = "your_username"  # 替换为你的 FTP 用户名
    password = "your_password"  # 替换为你的 FTP 密码

    # 连接到 FTP 服务器
    ftp = ftp_client(host, port, username, password)
    if ftp:
        # 列出当前目录内容
        list_directory(ftp)

        # 下载文件
        remote_file = "remote_file.txt"  # 替换为远程文件路径
        local_file = "local_file.txt"  # 替换为本地文件路径
        download_file(ftp, remote_file, local_file)

        # 上传文件
        local_file_to_upload = "local_file_to_upload.txt"  # 替换为本地文件路径
        remote_file_to_upload = "remote_file_to_upload.txt"  # 替换为远程文件路径
        upload_file(ftp, local_file_to_upload, remote_file_to_upload)

        # 关闭 FTP 连接
        close_ftp(ftp)

代码说明

FTP 客户端连接

  • 使用 ftplib.FTP 创建一个 FTP 对象。

  • 使用 ftp.connect() 连接到 FTP 服务器。

  • 使用 ftp.login() 登录到 FTP 服务器。

列出目录内容:使用 ftp.dir() 列出当前目录的内容。

下载文件:使用 ftp.retrbinary() 方法下载文件。该方法需要一个回调函数来处理接收到的数据,这里使用文件的 write 方法将数据写入本地文件。

上传文件:使用 ftp.storbinary() 方法上传文件。该方法需要一个文件对象作为参数,这里使用 open() 打开本地文件并以二进制模式读取。

关闭连接:使用 ftp.quit() 关闭 FTP 连接。

注意事项

FTP 服务器信息

  • 替换代码中的 hostportusernamepassword 为你的 FTP 服务器的实际信息。

  • 如果你的 FTP 服务器支持匿名登录,可以使用默认的用户名和密码(anonymous 和空密码)。

文件路径

  • 确保远程文件路径和本地文件路径正确无误。

  • 如果需要上传或下载目录,需要先切换到目标目录,可以使用 ftp.cwd() 方法。

异常处理:在实际应用中,建议对每个操作进行异常处理,确保在发生错误时能够正确处理。

安全性:如果需要更高的安全性,可以使用 ftplib.FTP_TLS 来启用加密连接。

示例:使用 FTP_TLS 加密连接

如果需要使用加密的 FTP 连接,可以使用 ftplib.FTP_TLS

from ftplib import FTP_TLS

def ftp_client_tls(host, port=21, username="anonymous", password=""):
    """
    简单的 FTP 客户端函数(加密连接)

    :param host: FTP 服务器地址
    :param port: FTP 服务器端口,默认为 21
    :param username: 用户名,默认为匿名用户
    :param password: 密码,默认为空
    :return: FTP 对象
    """
    try:
        # 创建 FTP_TLS 对象并连接到服务器
        ftp = FTP_TLS()
        ftp.connect(host, port)
        ftp.login(username, password)
        ftp.prot_p()  # 启用加密模式
        print(f"成功连接到 {host}:{port}(加密连接)")
        return ftp
    except Exception as e:
        print(f"连接失败:{e}")
        return None

ftp_client 函数替换为 ftp_client_tls 函数即可使用加密连接。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)