跳到主要内容

去除父文件夹层级

前两天在备寒假班的课程,主要就是收集课程资料。从学科网上下载的文件夹有时候会分成好几个文件夹层级,比如:

九年级同步练习题
├── Unit1 第一课时 同步练习
│   ├── Unit1 第一课时 同步练习(原卷版).docx
│   └── Unit1 第一课时 同步练习(解析版).docx
├── Unit1 第二课时 同步练习
│   ├── Unit1 第二课时 同步练习(原卷版).docx
│   └── Unit1 第二课时 同步练习(解析版).docx
└── ……此处省略无数个文件夹目录

为了后续的操作,我不得不把所有的文件放在同一级文件目录中。下面的代码就是为了实现这样的功能:

import os
import shutil

def move_files_to_single_folder(source_dir, target_dir):
    """
    将源目录下所有文件移动到目标目录中(包括子文件夹中的文件)。
    
    :param source_dir: 源目录路径
    :param target_dir: 目标目录路径
    """
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    
    for root, _, files in os.walk(source_dir):
        for file in files:
            source_file_path = os.path.join(root, file)
            target_file_path = os.path.join(target_dir, file)
            
            # 如果目标目录中存在同名文件,进行重命名
            if os.path.exists(target_file_path):
                base, ext = os.path.splitext(file)
                counter = 1
                while os.path.exists(target_file_path):
                    new_file_name = f"{base}_{counter}{ext}"
                    target_file_path = os.path.join(target_dir, new_file_name)
                    counter += 1
            
            # 移动文件
            shutil.move(source_file_path, target_file_path)
            print(f"已移动文件: {source_file_path} -> {target_file_path}")
    
    print("文件移动完成!")

# 示例使用
if __name__ == "__main__":
    source_directory = input("请输入源目录路径:").strip()
    target_directory = input("请输入目标目录路径:").strip()
    
    if os.path.exists(source_directory):
        move_files_to_single_folder(source_directory, target_directory)
    else:
        print("源目录不存在,请检查路径!")

刚刚的文件夹目录在脚本处理过后就会变成:

九年级同步练习题
├── Unit1 第一课时 同步练习(原卷版).docx
├── Unit1 第一课时 同步练习(解析版).docx
├── Unit1 第二课时 同步练习(原卷版).docx
├── Unit1 第二课时 同步练习(解析版).docx
└── ……此处省略无数个docx文件