Python 批量移动文件到指定目录:按规则归集文件
用 Python shutil.move 批量把文件按条件移动到目标目录,支持按扩展名、按名字关键词、按大小筛选,附预览和防覆盖。
场景痛点
项目迭代完,要把所有 最终版、定稿、签字版的合同单独归到「归档」文件夹;或者把超过 10MB 的附件挑出来挪到移动硬盘。手动在搜索框里输关键词筛选,再一个个剪切粘贴,容易漏、容易误拖。用 Python 写个筛选规则,把符合条件的文件批量搬到指定目录,原位置不动无关文件。
用到的库
纯标准库,无需 pip 安装:
# os、shutil 为标准库
完整代码
import os
import shutil
# ========== 配置区 ==========
SOURCE_DIR = "./项目文件" # 源目录
DEST_DIR = "./归档_定稿" # 目标目录
KEYWORD = "定稿" # 文件名包含这个关键词才移动
# 也可以改成按扩展名筛:EXTS = [".pdf", ".docx"]
EXTS = None # 设成列表则按扩展名筛,None 表示不限制
DRY_RUN = True
# ============================
def should_move(name: str) -> bool:
"""判断文件是否满足移动条件。"""
if KEYWORD and KEYWORD not in name:
return False
if EXTS is not None:
ext = os.path.splitext(name)[1].lower()
if ext not in EXTS:
return False
return True
def main():
if not os.path.isdir(SOURCE_DIR):
print(f"目录不存在:{SOURCE_DIR}")
return
count = 0
for name in os.listdir(SOURCE_DIR):
src_path = os.path.join(SOURCE_DIR, name)
if not os.path.isfile(src_path):
continue
if not should_move(name):
continue
dest_path = os.path.join(DEST_DIR, name)
if os.path.exists(dest_path):
stem, e = os.path.splitext(name)
dest_path = os.path.join(DEST_DIR, f"{stem}_新{e}")
print(f"[{'预览' if DRY_RUN else '移动'}] {name} -> {DEST_DIR}/")
if not DRY_RUN:
os.makedirs(DEST_DIR, exist_ok=True)
shutil.move(src_path, dest_path)
count += 1
print(f"\n共移动 {count} 个文件(DRY_RUN={DRY_RUN})")
if __name__ == "__main__":
main()
代码讲解
- should_move 集中筛选规则:把判断条件抽成函数,关键词、扩展名可以叠加。想按大小筛,就在函数里加
os.path.getsize(src_path) > 10*1024*1024这种判断。 - KEYWORD + EXTS 双条件:默认按文件名关键词筛;把
EXTS设成[".pdf",".docx"]就变成按扩展名筛。两个条件同时生效是「且」的关系。 - shutil.move:和
os.rename不同,它跨磁盘也能搬(跨盘时内部走复制+删除),目标目录不存在会报错,所以先makedirs。 - 重名保护:目标已有同名就加
_新后缀,绝不覆盖。
运行结果
终端打印 合同_定稿.pdf -> ./归档_定稿/。预览确认筛出来的都是该搬的文件,把 DRY_RUN 改成 False,符合条件的文件就被归集到 DEST_DIR。
注意事项
- 筛选条件别写太宽:KEYWORD 太短(比如「版」)会命中一堆「初稿」「修改版」,先预览看命中清单。
- 目标目录别在源目录里:比如 DEST_DIR = SOURCE_DIR + '/归档',第一次跑没问题,但第二次跑
os.listdir会把归档里的文件再扫一遍。建议目标放到源目录外。 - shutil.move 跨盘耗时:大文件跨盘移动是复制过程,别中断,中断可能出现两边都有文件。
- 快捷方式:
.lnk不是文件本体,移动它不会带走原文件,别误判。 - 重要文件先复制再移动:跑熟了再用 move,没把握先用 copy 验证。

更新时间:2026-09-14 21:27:30
上一篇:Python 批量去除文件名空格特殊字符:规范命名必备