如何将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()
额外优化建议
- 处理远程子目录:
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)
- 添加异常捕获:避免单个文件下载失败导致整个任务中断:
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)}")
- 路径兼容性:始终用
os.path.join()拼接路径,适配Windows、Linux等不同系统的路径分隔符。
内容的提问来源于stack exchange,提问作者Davi Americo
相关产品推荐
相关产品推荐

