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

如何用Python的shutil.move仅移动文件夹内容而非源文件夹

解决shutil.move将整个文件夹移入目标而非内容的问题

我之前也踩过这个坑——一开始以为shutil.move(staging_folder, final_folder)能直接把源文件夹里的所有内容搬到目标目录,但实际运行后完全不是那么回事!

先看Python 2官方文档对shutil.move的定义:

shutil.move(src, dst) 递归地将文件或目录(src)移动到另一个位置(dst)。
若目标是已存在的目录,src会被移入该目录;若目标已存在但非目录,可能会根据os.rename()的语义被覆盖。

这就是问题根源:当你的final_folder已经存在时,shutil.move会把整个staging_folder作为子目录放进final_folder里,而不是把staging内部的内容直接合并进去。比如我当时的场景:

  • 移动前:staging下有若干文件和子目录;final是一个已存在的目标目录
  • 执行shutil.move(staging_folder, final_folder)后:final里多了一个staging子目录,里面才是原来的文件和子目录,这完全不符合预期!

正确的实现方式:遍历源目录内容逐个移动

要实现把staging内的所有内容直接移到final下,需要遍历staging里的每一项,分别调用shutil.move:

import os
import shutil

# 替换成你的实际路径
staging_folder = "/path/to/your/staging"
final_folder = "/path/to/your/final"

# 遍历staging目录下的所有文件和子目录
for item_name in os.listdir(staging_folder):
    # 拼接完整的源路径和目标路径
    src_path = os.path.join(staging_folder, item_name)
    dst_path = os.path.join(final_folder, item_name)
    # 移动当前项到目标目录
    shutil.move(src_path, dst_path)

额外注意事项

  • 如果final_folder可能不存在,记得先创建它:
    Python 3.2+可以用os.makedirs(final_folder, exist_ok=True);
    Python 2需要先判断再创建:
    if not os.path.exists(final_folder):
        os.makedirs(final_folder)
    
  • 这个方法会递归处理子目录,和shutil.move的原生特性一致
  • 如果目标目录下已经存在同名的文件/目录,会遵循os.rename的系统语义(通常是覆盖,不同系统可能有差异)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:52:33