我的知识记录

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 验证。

Python 批量移动文件到指定目录:按规则归集文件

标签:

更新时间:2026-09-14 21:27:30

上一篇:Python 批量去除文件名空格特殊字符:规范命名必备

下一篇:Python批量解压多个压缩包:自动遍历目录一键提取