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

如何使用Python列出包含指定类型文件的文件夹并实现文件批量迁移

解决方案

你的需求完全可以用Python实现,以下是适配你需求的优化后代码,解决了多文件类型匹配的问题,同时补充了文件夹检索、迁移选择的功能,也修复了你原有代码中的逻辑漏洞。

优化后完整代码

import os
import shutil

def main():
    # 1. 输入基础配置
    source_root = input("请输入要检索的根文件夹路径(例如:C:/Users/用户名/Desktop/照片):\n").strip()
    ext_input = input("请输入需要匹配的文件后缀,多个用英文逗号分隔(例如:jpg,png,mp4,mov):\n").strip()
    # 处理后缀,统一转小写,去空格
    target_exts = [ext.strip().lower() for ext in ext_input.split(',') if ext.strip()]
    
    if not target_exts:
        print("未输入有效文件后缀,程序退出")
        return
    if not os.path.isdir(source_root):
        print("输入的源路径不存在,程序退出")
        return

    # 2. 递归检索所有匹配文件和对应文件夹
    matched_files = []
    matched_folders = set()
    for root, dirs, files in os.walk(source_root):
        for file in files:
            file_ext = os.path.splitext(file)[1].lower().lstrip('.')
            if file_ext in target_exts:
                full_path = os.path.join(root, file)
                matched_files.append(full_path)
                matched_folders.add(root)
    
    # 3. 展示检索结果
    if not matched_files:
        print("未找到匹配的文件,程序退出")
        return
    print(f"\n共找到 {len(matched_files)} 个匹配文件,所属文件夹如下:")
    for idx, folder in enumerate(matched_folders, 1):
        print(f"{idx}. {folder}")

    # 4. 迁移选择
    move_choice = input("\n请选择迁移方式:输入1迁移所有含匹配文件的整文件夹,输入2仅迁移匹配的文件:\n").strip()
    dest_root = input("请输入目标存储路径(例如:D:/家庭照片整理):\n").strip()
    os.makedirs(dest_root, exist_ok=True)

    if move_choice == '1':
        print("正在迁移整文件夹...")
        for folder in matched_folders:
            # 取文件夹名,放到目标路径下
            folder_name = os.path.basename(folder)
            dest_path = os.path.join(dest_root, folder_name)
            # 避免重名,重名的话加序号
            counter = 1
            while os.path.exists(dest_path):
                dest_path = os.path.join(dest_root, f"{folder_name}_{counter}")
                counter +=1
            shutil.move(folder, dest_path)
        print("所有文件夹迁移完成")
    elif move_choice == '2':
        print("正在迁移匹配文件...")
        for file in matched_files:
            file_name = os.path.basename(file)
            dest_path = os.path.join(dest_root, file_name)
            # 避免重名覆盖
            counter = 1
            while os.path.exists(dest_path):
                name, ext = os.path.splitext(file_name)
                dest_path = os.path.join(dest_root, f"{name}_{counter}{ext}")
                counter +=1
            shutil.move(file, dest_path)
        print("所有匹配文件迁移完成")
    else:
        print("输入的选择无效,程序退出")
        return

if __name__ == "__main__":
    main()

主要改动说明

  • 支持用户输入任意多个文件类型,自动忽略大小写和输入时的多余空格
  • 新增递归扫描子目录的功能,适配分散存储的资源检索需求
  • 迁移前会先列出所有包含目标类型文件的文件夹,确认后再执行操作
  • 新增重名文件/文件夹自动重命名逻辑,避免原有数据被覆盖
  • 修复了原代码中不管是否选择迁移整文件夹,都会执行单文件移动的逻辑错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:45:09