如何用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
相关产品推荐
相关产品推荐

