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

Windows10下shutil.move同盘移动文件过慢,求媲美ctrl+X性能的替代方案

问题根源

你遇到的性能问题是shutil.move在Windows下的路径判断逻辑导致的:
你代码中的目标路径dst_folder末尾带斜杠,执行shutil.move(src_folder, dst_folder)时,会默认将files_to_move文件夹放入_out目录下,目标完整路径为C:/Users/sim/Documents/_out/files_to_move。如果这个路径已经存在,shutil.move不会直接重写整个目录,而是会将源文件夹内的所有文件逐个复制到已存在的目标目录中,完全跳过了同盘下仅修改文件系统索引的os.rename逻辑,才会出现和跨盘复制一样的长耗时。
手动ctrl+X剪切粘贴时,系统会直接替换整个目标文件夹,仅修改NTFS的索引节点,所以可以瞬间完成。

解决方法

方法1:直接调用系统原生move命令(性能和ctrl+X完全一致)

Windows下直接调用系统自带的move命令,逻辑和资源管理器操作完全相同,代码示例:

import subprocess

src_folder = r'C:\Users\sim\Documents\files_to_move'
dst_folder = r'C:\Users\sim\Documents\_out'

# /Y参数表示自动覆盖已存在的目标,路径加引号避免空格报错
subprocess.run(f'move /Y "{src_folder}" "{dst_folder}"', shell=True, check=True)

方法2:调整shutil.move调用逻辑,触发os.rename

提前检查目标路径下是否存在同名文件夹,存在则先删除,保证shutil.move可以触发同盘重命名逻辑,无需逐个复制文件:

import os
import shutil

src_folder = 'C:/Users/sim/Documents/files_to_move'
dst_folder = 'C:/Users/sim/Documents/_out'
target_full_path = os.path.join(dst_folder, os.path.basename(src_folder))

# 目标存在则先删除
if os.path.exists(target_full_path):
    shutil.rmtree(target_full_path)

shutil.move(src_folder, dst_folder)

方法3:直接调用底层os.rename

同盘移动场景下可以直接跳过shutil的冗余判断,调用系统底层重命名接口:

import os
import shutil

src_folder = 'C:/Users/sim/Documents/files_to_move'
target_full_path = 'C:/Users/sim/Documents/_out/files_to_move'

if os.path.exists(target_full_path):
    shutil.rmtree(target_full_path)

os.rename(src_folder, target_full_path)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:03