Python批量移动FTP文件至新文件夹遇问题求解决方案
批量移动FTP服务器文件到新文件夹的解决方案
问题根源分析
- 目标路径错误:从错误日志看,你实际执行的是
ftp.rename(file, "/folder1/")——FTP的RNTO命令要求指定完整的目标文件路径(比如/folder1/img1.png),仅传入文件夹路径会导致服务器无法识别具体目标,触发错误。 - 误处理文件夹:
ftp.nlst()会返回当前目录下的所有条目(文件+文件夹),你刚创建的folder1也会被包含在列表中,循环时尝试将文件夹移动到自身,引发550 Device or resource busy错误。 - 未过滤非文件条目:直接遍历所有目录条目,会尝试移动文件夹,而我们的目标是移动文件,需要先过滤掉文件夹类型的条目。
修正后的批量移动代码
import ftplib ftp = ftplib.FTP(host, username, password) ftp.encoding = "utf-8" # 创建目标文件夹 target_folder = "folder1" ftp.mkd(target_folder) # 获取当前目录下的所有文件(过滤掉文件夹) file_list = [] for entry in ftp.nlst(): # 通过ftp.size判断是否为文件:文件夹返回None,文件返回字节数 try: if ftp.size(entry) is not None: file_list.append(entry) except ftplib.error_perm: # 部分FTP服务器对文件夹执行size会返回权限错误,直接跳过 continue # 批量移动文件 for file_name in file_list: # 拼接完整的目标路径:相对路径更稳妥,避免绝对路径差异 target_path = f"{target_folder}/{file_name}" ftp.rename(file_name, target_path) print(f"已移动文件: {file_name} -> {target_path}") ftp.quit()
额外优化建议
- 使用相对路径:不同FTP服务器的绝对路径规则可能不同,用相对路径(基于当前登录目录)兼容性更好。
- 异常捕获:在批量操作中加入异常捕获,避免单个文件移动失败导致整个程序终止:
for file_name in file_list: target_path = f"{target_folder}/{file_name}" try: ftp.rename(file_name, target_path) print(f"已移动文件: {file_name} -> {target_path}") except ftplib.error_perm as e: print(f"移动文件失败 {file_name}: {e}")
- 预过滤文件:如果只需要移动特定类型的文件(如
.png),可以在过滤时加入后缀判断:
if ftp.size(entry) is not None and entry.endswith(".png"): file_list.append(entry)
关于FTP文件移动的说明
FTP协议中没有专门的“移动”命令,服务器端的文件移动本质就是通过RNFR(重命名源)和RNTO(重命名目标)命令实现的,也就是你用的ftp.rename方法,这是最高效的方式——不需要下载文件到本地再上传,完全在服务器端完成操作,没有额外的带宽消耗。
内容的提问来源于stack exchange,提问作者Quentin Gomez
相关产品推荐
相关产品推荐

