如何修改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()
关键修改点说明
- 修正FTP服务器地址:原代码里
Ftp_Server_host写了xcfgn@wer.com,这是不对的,FTP主机应该是单纯的域名/IP,用户名单独传入login()方法 - 创建本地目录:用
os.makedirs(local_path, exist_ok=True)确保目标目录存在,避免因目录不存在报错 - 正确拼接本地路径:用
os.path.basename(item)提取远程文件的文件名,再和本地目录拼接,保证所有文件都存在指定目录下 - 过滤目录:通过
ftp.size(item)判断是否是文件,跳过子目录,避免下载错误 - 使用with语句:自动管理文件句柄,不用手动
close(),更安全
如果你原本是想用SFTP(而不是FTP),可以告诉我,我再给你调整成paramiko的SFTP版本~
内容的提问来源于stack exchange,提问作者Mech_Saran
相关产品推荐
相关产品推荐

