使用Python将大文件夹中的文件分成文件数量相等的小文件夹:
import os
import shutil
from pathlib import Pathdef split_files_into_groups(source_dir="q:/source_dir", files_per_group=1000, prefix="q:/new"):"""Split files from source directory into groups and move them to numbered folders.Features:- Checks if source directory exists and contains files- Creates numbered folders (new_01, new_02, etc.)- Moves files in batches of specified size- Provides progress feedback- Handles errors gracefullyArgs:source_dir (str): Path to source directory (default: "sorce_dir")files_per_group (int): Max files per group (default: 1000)prefix (str): Prefix for output folders (default: "new")"""try:# Validate source directoryif not os.path.exists(source_dir):raise FileNotFoundError(f"Error: Source directory '{source_dir}' not found")if not os.path.isdir(source_dir):raise NotADirectoryError(f"Error: '{source_dir}' is not a directory")# Get all files (excluding subdirectories)all_files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]if not all_files:print(f"Info: No files found in '{source_dir}'")returntotal_files = len(all_files)print(f"Found {total_files} files in '{source_dir}'")# Calculate number of groups needednum_groups = (total_files + files_per_group - 1) // files_per_groupprint(f"Creating {num_groups} groups with max {files_per_group} files each")# Process files in batchesfor group_num in range(1, num_groups + 1):group_name = f"{prefix}_{group_num:02d}" # Format as 01, 02, etc.os.makedirs(group_name, exist_ok=True)# Get files for current groupstart_idx = (group_num - 1) * files_per_groupend_idx = min(group_num * files_per_group, total_files)group_files = all_files[start_idx:end_idx]# Move filesprint(f"\nProcessing group {group_name} ({len(group_files)} files):")for i, file in enumerate(group_files, 1):src = os.path.join(source_dir, file)dst = os.path.join(group_name, file)shutil.move(src, dst)if i % 100 == 0 or i == len(group_files):print(f" Moved {i}/{len(group_files)} files")print("\nOperation completed successfully")except Exception as e:print(f"\nError occurred: {str(e)}")print("Please check:")print("- Source directory exists and is accessible")print("- You have write permissions")print("- There are no file naming conflicts")if __name__ == "__main__":print("File Splitter Utility")print("=====================")split_files_into_groups()print("\nNote: Original files will be moved (not copied)")
- 读取同级目录下的source_dir文件夹里的文件
- 将这些文件分成每1000个文件一组
- 创建以"new_"为前缀的编号文件夹(如new_01, new_02等)
- 将每组1000个文件移动到对应的文件夹中