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

如何修改Python FTP下载代码,将文件保存到自定义本地目录

解决FTP批量下载文件到指定本地目录的问题

嘿,我看了你的代码,发现几个关键问题导致你没法把所有文件统一下载到C:\data_download\目录,咱们一步步来修复:

原代码的核心问题

  • 混用了ftplib(FTP协议)和paramiko的SFTP功能,代码里ftp_ssh根本没定义,运行肯定会报错
  • 本地文件路径拼接错误:os.path.join(local_path)只返回目录本身,没加上文件名,导致所有文件都试图写入同一个路径(甚至是目录,会触发权限错误)
  • 没有过滤远程目录里的子目录,ftp.nlst()会返回目录和文件,下载目录会失败

修正后的代码(基于ftplib)

我统一用ftplib来实现,确保所有文件都下载到你指定的本地目录,同时处理了目录创建、过滤子目录的问题:

import ftplib
import os
from ftplib import FTP

# 修正:FTP服务器地址应该是主机名,不含用户名
Ftp_Server_host = 'wer.com'
Ftp_username = 'xcfgn'  # 从原host里拆分出来的用户名
Ftp_password = 'xxxxx'
Ftp_source_files_path = '/data/abc/transfer/'
local_path = 'C:\\data_download\\'

# 确保本地目录存在,不存在则创建
os.makedirs(local_path, exist_ok=True)

try:
    ftp = FTP(Ftp_Server_host)
    ftp.login(user=Ftp_username, passwd=Ftp_password)
    print(f"已连接到远程服务器: {Ftp_Server_host}")
    
    # 切换到远程目标目录
    ftp.cwd(Ftp_source_files_path)
    print(f"当前远程目录: {ftp.pwd()}")
    
    # 获取远程目录下的所有条目
    files_list = ftp.nlst()
    
    for item in files_list:
        # 判断是否是文件(目录的size会返回None)
        try:
            file_size = ftp.size(item)
            if file_size is not None:
                # 提取文件名,拼接本地路径
                filename = os.path.basename(item)
                local_fn = os.path.join(local_path, filename)
                
                print(f"正在下载: {item} -> {local_fn}")
                with open(local_fn, "wb") as local_file:
                    ftp.retrbinary(f"RETR {item}", local_file.write)
                print(f"{item} 下载完成")
            else:
                print(f"{item} 是目录,跳过")
        except ftplib.error_perm:
            print(f"无法访问 {item},跳过")
            
    print("\n所有文件已完成下载!")
    
finally:
    # 确保关闭FTP连接
    ftp.quit()

关键修改点说明

  1. 修正FTP服务器地址:原代码里Ftp_Server_host写了xcfgn@wer.com,这是不对的,FTP主机应该是单纯的域名/IP,用户名单独传入login()方法
  2. 创建本地目录:用os.makedirs(local_path, exist_ok=True)确保目标目录存在,避免因目录不存在报错
  3. 正确拼接本地路径:用os.path.basename(item)提取远程文件的文件名,再和本地目录拼接,保证所有文件都存在指定目录下
  4. 过滤目录:通过ftp.size(item)判断是否是文件,跳过子目录,避免下载错误
  5. 使用with语句:自动管理文件句柄,不用手动close(),更安全

如果你原本是想用SFTP(而不是FTP),可以告诉我,我再给你调整成paramiko的SFTP版本~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:27:56