You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将FTP目录数据下载到本地文件夹?解决Python权限拒绝异常

解决FTP下载时权限拒绝的问题

你遇到的权限拒绝异常,核心原因是把本地文件夹路径当作了要写入的文件路径。在循环中local_filename = self.dir_data_base仅指定了目录,而open()函数无法对文件夹执行写入操作,因此触发权限错误。

修复后的核心代码

# 省略前面的工作簿检查、FTP连接等代码...
ftp.cwd('/Banco de dados/' + backup_name)
filenames = ftp.nlst()  # 获取远程目录内的文件名
import os

# 确保本地目标目录存在,不存在则创建
if not os.path.exists(self.dir_data_base):
    os.makedirs(self.dir_data_base)

for filename in filenames:
    # 拼接本地文件的完整路径:目录 + 文件名
    local_filename = os.path.join(self.dir_data_base, filename)
    # 使用with语句自动管理文件句柄,无需手动调用close()
    with open(local_filename, 'wb') as file:
        ftp.retrbinary(f'RETR {filename}', file.write)

ftp.quit()

额外优化建议

  1. 处理远程子目录:ftp.nlst()可能返回远程子目录名称,如果需要递归下载,需先判断路径类型。可以通过尝试切换远程目录来验证:
for filename in filenames:
    try:
        # 尝试切换到该路径,成功则是目录
        ftp.cwd(filename)
        # 这里添加递归下载子目录的逻辑
        ftp.cwd('..')  # 返回上级目录
        continue
    except ftplib.error_perm:
        # 切换失败,说明是文件,执行下载
        local_filename = os.path.join(self.dir_data_base, filename)
        with open(local_filename, 'wb') as file:
            ftp.retrbinary(f'RETR {filename}', file.write)
  1. 添加异常捕获:避免单个文件下载失败导致整个任务中断:
for filename in filenames:
    local_filename = os.path.join(self.dir_data_base, filename)
    try:
        with open(local_filename, 'wb') as file:
            ftp.retrbinary(f'RETR {filename}', file.write)
        print(f"文件 {filename} 下载完成")
    except Exception as e:
        print(f"下载 {filename} 失败: {str(e)}")
  1. 路径兼容性:始终用os.path.join()拼接路径,适配Windows、Linux等不同系统的路径分隔符。

内容的提问来源于stack exchange,提问作者Davi Americo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:33:22