在日常工作中,面对庞大的文件数量,整理工作往往耗时又繁琐。为此,我使用 Python 编写了一款实用的文件整理器。它能够将目录里的文件按每 1000 个整理到一个文件夹中,首先分析整个目录的文件数量,然后自动新建文件夹(如文件夹 1、文件夹 2 等),将相应数量的文件精准移动。
功能亮点 :
- 文件收集 :借助
os.scandir()
高效获取目录中的所有文件,精准排除子目录,确保只处理目标文件。 - 排序处理 :对文件名进行排序,让每次整理的结果都保持一致,方便后续查找与管理。
- 智能分组 :自动计算所需文件夹数量,采用向上取整的方式,还支持自定义批量大小,默认为 1000,灵活适配不同需求。
- 安全处理 :自动检测同名文件 / 目录,提供友好的进度提示,对于错误文件也会有明确的处理提示,保障整理过程的顺利进行。
- 高效移动 :利用
shutil.move()
实现文件的快速移动操作。
新版本升级 :
- 增强路径输入验证 :新增
get_valid_directory()
函数,支持路径中带空格的处理,自动去除路径中的引号,循环验证直到输入有效路径,还支持输入 q 退出程序,让操作更加便捷与人性化。 - 交互优化 :添加整理前的统计信息确认,以百分比形式显示进度条,使用三位数编号的文件夹(如 001、002...010),完成提示更加清晰,错误文件单独提示,不影响整体进度,提升用户体验。
- 新增功能 :运用
os.makedirs(exist_ok=True)
自动处理已存在目录,显示每个文件夹的实际移动成功率,添加程序标题和结束标识,异常处理更加完善。 - 显示优化 :采用符号(✓ × !)增强可读性,统计信息显示对齐,进度更新使用回车符实现原地刷新,让界面更加简洁直观。
使用方法 :
- 运行程序后,会立即提示输入路径,支持拖拽文件夹到命令行快速输入路径,输入路径后可查看统计信息并确认,在处理过程中会显示实时进度,每个文件夹处理完成后会显示成功统计。特别注意,此版本已支持路径中包含空格的情况,可直接拖拽包含空格的文件夹路径到命令行中使用,让你轻松告别文件整理的烦恼,大幅提升工作效率。
代码:
import os
import shutil
from math import ceil
def get_valid_directory():
"""获取有效的目录路径"""
while True:
path = input("请输入要整理的目录路径(或输入q退出): ").strip()
if path.lower() == 'q':
exit()
# 处理路径中的引号和空格
path = path.replace('"', '').replace("'", "")
if not os.path.exists(path):
print(f"× 路径不存在:{path}")
continue
if not os.path.isdir(path):
print(f"× 这不是一个目录:{path}")
continue
return os.path.abspath(path)
def organize_files(source_dir, batch_size=1000):
try:
# 获取所有文件列表(排除目录)
files = []
with os.scandir(source_dir) as entries:
for entry in entries:
if entry.is_file():
files.append(entry.name)
# 按文件名排序
files.sort()
total_files = len(files)
if total_files == 0:
print("没有找到需要整理的文件")
return
# 显示统计信息
print("\n" + "="*40)
print(f"目录路径:{source_dir}")
print(f"文件总数:{total_files}")
print(f"每个文件夹存放数量:{batch_size}")
print(f"将创建 {ceil(total_files / batch_size)} 个文件夹")
print("="*40 + "\n")
# 用户确认
confirm = input("是否开始整理?(y/n) ").lower()
if confirm != 'y':
print("操作已取消")
return
# 创建文件夹并移动文件
for i in range(ceil(total_files / batch_size)):
folder_name = os.path.join(source_dir, f"文件夹{i+1:03d}") # 使用三位数编号
# 创建文件夹(如果不存在)
os.makedirs(folder_name, exist_ok=True)
# 获取当前批次的文件
start = i * batch_size
end = start + batch_size
current_batch = files[start:end]
# 移动文件并显示进度
moved = 0
for idx, filename in enumerate(current_batch, 1):
src_path = os.path.join(source_dir, filename)
dst_path = os.path.join(folder_name, filename)
try:
shutil.move(src_path, dst_path)
moved += 1
except Exception as e:
print(f"! 移动文件失败:{filename} - {str(e)}")
# 显示进度条
progress = idx / len(current_batch) * 100
print(f"\r正在移动文件到 文件夹{i+1:03d}: {progress:.1f}%", end='')
print(f"\n✓ 成功移动 {moved}/{len(current_batch)} 个文件到 {folder_name}")
except Exception as e:
print(f"发生错误:{str(e)}")
if __name__ == "__main__":
print("="*40)
print("文件整理器 v2.0".center(40))
print("="*40)
target_dir = get_valid_directory()
organize_files(target_dir)
print("\n" + "="*40)
print("文件整理完成!".center(40))
print("="*40)
数量可以自己修改代码。
- All rights reserved.
- No part of this website, including text and images, may be reproduced, modified, distributed, or transmitted in any form or by any means, without the prior written permission of the author.
- Unauthorized commercial use is strictly prohibited.
- Unauthorized personal use is strictly prohibited.