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

Python批量移动FTP文件至新文件夹遇问题求解决方案

批量移动FTP服务器文件到新文件夹的解决方案

问题根源分析

  1. 目标路径错误:从错误日志看,你实际执行的是ftp.rename(file, "/folder1/")——FTP的RNTO命令要求指定完整的目标文件路径(比如/folder1/img1.png),仅传入文件夹路径会导致服务器无法识别具体目标,触发错误。
  2. 误处理文件夹:ftp.nlst()会返回当前目录下的所有条目(文件+文件夹),你刚创建的folder1也会被包含在列表中,循环时尝试将文件夹移动到自身,引发550 Device or resource busy错误。
  3. 未过滤非文件条目:直接遍历所有目录条目,会尝试移动文件夹,而我们的目标是移动文件,需要先过滤掉文件夹类型的条目。

修正后的批量移动代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:41:03