
电脑用久了桌面和下载文件夹就是重灾区——“新建文件夹 (1)” “新建文件夹 (2)” “最终版” “最终版2”……用 Python 几行代码就能批量整理干净。一、批量重命名1. 统一命名规则importosdefbatch_rename(directory,prefixfile,start1,digits3): 批量重命名文件 directory: 文件夹路径 prefix: 文件名前缀 start: 起始编号 digits: 编号位数如 3 → 001, 002 files[fforfinos.listdir(directory)ifos.path.isfile(os.path.join(directory,f))]# 按修改时间排序可选files.sort(keylambdax:os.path.getmtime(os.path.join(directory,x)))fori,filenameinenumerate(files):# 获取文件扩展名name,extos.path.splitext(filename)new_namef{prefix}_{str(starti).zfill(digits)}{ext}old_pathos.path.join(directory,filename)new_pathos.path.join(directory,new_name)os.rename(old_path,new_path)print(f{filename}→{new_name})# 使用batch_rename(D:/照片/2026婚纱照,prefixwedding,start1,digits3)# 输出IMG_001.jpg → wedding_001.jpgbatch_rename(D:/下载/课件,prefixnote,start1,digits2)# 输出新建 Microsoft Word 文档.docx → note_01.docx2. 添加日期前缀fromdatetimeimportdatetimedefadd_date_prefix(directory):给文件添加日期前缀todaydatetime.now().strftime(%Y%m%d)forfinos.listdir(directory):filepathos.path.join(directory,f)ifos.path.isfile(filepath)andnotf.startswith(today):new_namef{today}_{f}new_pathos.path.join(directory,new_name)os.rename(filepath,new_path)print(f添加前缀:{f}→{new_name})# 使用给今天下载的课件加日期前缀add_date_prefix(D:/下载/课件)3. 批量替换文件名中的文字defreplace_filename_text(directory,old_text,new_text):批量替换文件名中的关键词count0forfinos.listdir(directory):filepathos.path.join(directory,f)ifos.path.isfile(filepath)andold_textinf:new_namef.replace(old_text,new_text)new_pathos.path.join(directory,new_name)os.rename(filepath,new_path)print(f替换:{f}→{new_name})count1print(f共替换{count}个文件)# 使用去掉文件名中的【课程资料】前缀replace_filename_text(D:/课件,【课程资料】,)# 统一空格replace_filename_text(D:/下载, , )# 双空格变单空格二、按类型自动归档把杂乱的文件夹一键按文件类型分类整理importosimportshutil EXTENSION_MAP{# 图片.jpg:图片,.jpeg:图片,.png:图片,.gif:图片,.bmp:图片,.webp:图片,# 文档.doc:文档,.docx:文档,.pdf:文档,.xls:表格,.xlsx:表格,.ppt:演示文稿,.pptx:演示文稿,.txt:文本,.md:文本,# 压缩包.zip:压缩包,.rar:压缩包,.7z:压缩包,# 视频.mp4:视频,.avi:视频,.mov:视频,# 代码.py:代码,.java:代码,.js:代码,.html:代码,.css:代码,.sql:代码,}defauto_sort_files(directory):按文件类型自动归档到子文件夹ifnotos.path.exists(directory):print(f文件夹不存在:{directory})returnmoved_count0forfinos.listdir(directory):filepathos.path.join(directory,f)ifnotos.path.isfile(filepath):continue# 获取扩展名_,extos.path.splitext(f)extext.lower()# 确定目标文件夹folder_nameEXTENSION_MAP.get(ext,其他)target_diros.path.join(directory,folder_name)os.makedirs(target_dir,exist_okTrue)# 移动文件target_pathos.path.join(target_dir,f)ifnotos.path.exists(target_path):shutil.move(filepath,target_path)moved_count1else:# 同名文件加编号name,extos.path.splitext(f)target_pathos.path.join(target_dir,f{name}_1{ext})shutil.move(filepath,target_path)moved_count1print(f整理完成{moved_count}个文件已归档)# 使用auto_sort_files(D:/下载)三、删除重复文件1. 按大小和名称删除deffind_duplicates(directory):查找重复文件同名且同大小files_info{}duplicates[]forroot,_,filesinos.walk(directory):forfinfiles:filepathos.path.join(root,f)sizeos.path.getsize(filepath)# 用 (文件名, 大小) 作为 keykey(f,size)ifkeyinfiles_info:duplicates.append((filepath,files_info[key]))else:files_info[key]filepathreturnduplicatesdefdelete_duplicates(directory,dry_runTrue):删除重复文件dry_runTrue 只预览不删除duplicatesfind_duplicates(directory)ifnotduplicates:print(没有找到重复文件)returnprint(f找到{len(duplicates)}组重复文件\n)fordup,originalinduplicates:print(f 保留:{original})print(f 删除:{dup}\n)ifnotdry_run:os.remove(dup)ifdry_run:print(f以上是预览结果共可清理{len(duplicates)}个文件)print(f确认删除请运行: delete_duplicates({directory}, dry_runFalse))else:print(f已删除{len(duplicates)}个重复文件)# 使用delete_duplicates(D:/照片,dry_runTrue)2. 按内容哈希删除更准确连不同名的重复内容也能找出来importhashlibdeffind_duplicates_by_hash(directory):通过文件内容哈希查找重复文件hash_map{}duplicates[]forroot,_,filesinos.walk(directory):forfinfiles:filepathos.path.join(root,f)try:withopen(filepath,rb)asfh:file_hashhashlib.md5(fh.read()).hexdigest()except:continue# 跳过不能读的文件iffile_hashinhash_map:duplicates.append((filepath,hash_map[file_hash]))else:hash_map[file_hash]filepathreturnduplicates四、按日期归档importosimportshutilfromdatetimeimportdatetimedefarchive_by_month(directory,file_extensionsNone):按年月归档文件适合照片、截图等iffile_extensionsisNone:file_extensions[.jpg,.jpeg,.png,.gif,.mp4]moved0forfinos.listdir(directory):filepathos.path.join(directory,f)ifnotos.path.isfile(filepath):continue# 筛选文件类型_,extos.path.splitext(f)ifext.lower()notinfile_extensions:continue# 获取文件修改时间mtimeos.path.getmtime(filepath)file_datedatetime.fromtimestamp(mtime)year_monthfile_date.strftime(%Y年%m月)# 创建目标文件夹target_diros.path.join(directory,year_month)os.makedirs(target_dir,exist_okTrue)# 移动shutil.move(filepath,os.path.join(target_dir,f))moved1print(f已归档{moved}个文件到{year_month}文件夹)五、清空空文件夹defremove_empty_dirs(directory):递归删除空文件夹removed0forroot,dirs,filesinos.walk(directory,topdownFalse):fordindirs:dirpathos.path.join(root,d)try:ifnotos.listdir(dirpath):os.rmdir(dirpath)print(f删除空文件夹:{dirpath})removed1except:passprint(f共删除{removed}个空文件夹)六、一键整理桌面defclean_desktop():一键整理桌面desktopos.path.expanduser(~/Desktop)print(f整理桌面:{desktop})# 1. 按类型归档auto_sort_files(desktop)# 2. 删除空文件夹remove_empty_dirs(desktop)# 3. 查找重复文件duplicatesfind_duplicates(desktop)ifduplicates:print(f桌面有{len(duplicates)}组重复文件)ford,oinduplicates[:5]:print(f{os.path.basename(d)})else:print(无重复文件)print(桌面整理完成)# 使用谨慎会移动桌面上所有文件# clean_desktop()七、文件整理工具箱classFileOrganizer:文件整理工具箱def__init__(self,base_dir):self.base_dirbase_dirdefpreview(self):预览当前文件统计total0ext_count{}forfinos.listdir(self.base_dir):ifos.path.isfile(os.path.join(self.base_dir,f)):total1_,extos.path.splitext(f)ext_count[ext]ext_count.get(ext,0)1print(f{self.base_dir})print(f 共{total}个文件)forext,countinsorted(ext_count.items(),keylambdax:-x[1])[:10]:print(f{ext}:{count}个)deforganize(self):一键整理print(开始整理...)auto_sort_files(self.base_dir)remove_empty_dirs(self.base_dir)print(整理完成)# 使用orgFileOrganizer(D:/下载)org.preview()org.organize()总结文件整理最常用的三个场景batch_rename(文件夹,前缀)# 批量重命名auto_sort_files(文件夹)# 按类型归档find_duplicates(文件夹)# 查找重复建议先dry_runTrue预览效果确认没问题再实际执行。不要一上来就跑删除命令血的教训。 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。