news 2026/7/3 1:01:27

Python 自动化之文件批量整理——重命名、分类归档、清理重复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 自动化之文件批量整理——重命名、分类归档、清理重复

电脑用久了,桌面和下载文件夹就是重灾区——“新建文件夹 (1)” “新建文件夹 (2)” “最终版” “最终版2”……用 Python 几行代码就能批量整理干净。

一、批量重命名

1. 统一命名规则

importosdefbatch_rename(directory,prefix="file",start=1,digits=3):""" 批量重命名文件 directory: 文件夹路径 prefix: 文件名前缀 start: 起始编号 digits: 编号位数(如 3 → 001, 002) """files=[fforfinos.listdir(directory)ifos.path.isfile(os.path.join(directory,f))]# 按修改时间排序(可选)files.sort(key=lambdax:os.path.getmtime(os.path.join(directory,x)))fori,filenameinenumerate(files):# 获取文件扩展名name,ext=os.path.splitext(filename)new_name=f"{prefix}_{str(start+i).zfill(digits)}{ext}"old_path=os.path.join(directory,filename)new_path=os.path.join(directory,new_name)os.rename(old_path,new_path)print(f"{filename}{new_name}")# 使用batch_rename("D:/照片/2026婚纱照",prefix="wedding",start=1,digits=3)# 输出:IMG_001.jpg → wedding_001.jpgbatch_rename("D:/下载/课件",prefix="note",start=1,digits=2)# 输出:新建 Microsoft Word 文档.docx → note_01.docx

2. 添加日期前缀

fromdatetimeimportdatetimedefadd_date_prefix(directory):"""给文件添加日期前缀"""today=datetime.now().strftime("%Y%m%d")forfinos.listdir(directory):filepath=os.path.join(directory,f)ifos.path.isfile(filepath)andnotf.startswith(today):new_name=f"{today}_{f}"new_path=os.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):"""批量替换文件名中的关键词"""count=0forfinos.listdir(directory):filepath=os.path.join(directory,f)ifos.path.isfile(filepath)andold_textinf:new_name=f.replace(old_text,new_text)new_path=os.path.join(directory,new_name)os.rename(filepath,new_path)print(f"替换:{f}{new_name}")count+=1print(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_count=0forfinos.listdir(directory):filepath=os.path.join(directory,f)ifnotos.path.isfile(filepath):continue# 获取扩展名_,ext=os.path.splitext(f)ext=ext.lower()# 确定目标文件夹folder_name=EXTENSION_MAP.get(ext,"其他")target_dir=os.path.join(directory,folder_name)os.makedirs(target_dir,exist_ok=True)# 移动文件target_path=os.path.join(target_dir,f)ifnotos.path.exists(target_path):shutil.move(filepath,target_path)moved_count+=1else:# 同名文件加编号name,ext=os.path.splitext(f)target_path=os.path.join(target_dir,f"{name}_1{ext}")shutil.move(filepath,target_path)moved_count+=1print(f"整理完成!{moved_count}个文件已归档")# 使用auto_sort_files("D:/下载")

三、删除重复文件

1. 按大小和名称删除

deffind_duplicates(directory):"""查找重复文件(同名且同大小)"""files_info={}duplicates=[]forroot,_,filesinos.walk(directory):forfinfiles:filepath=os.path.join(root,f)size=os.path.getsize(filepath)# 用 (文件名, 大小) 作为 keykey=(f,size)ifkeyinfiles_info:duplicates.append((filepath,files_info[key]))else:files_info[key]=filepathreturnduplicatesdefdelete_duplicates(directory,dry_run=True):"""删除重复文件(dry_run=True 只预览不删除)"""duplicates=find_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_run=False)")else:print(f"已删除{len(duplicates)}个重复文件")# 使用delete_duplicates("D:/照片",dry_run=True)

2. 按内容哈希删除(更准确)

连不同名的重复内容也能找出来:

importhashlibdeffind_duplicates_by_hash(directory):"""通过文件内容哈希查找重复文件"""hash_map={}duplicates=[]forroot,_,filesinos.walk(directory):forfinfiles:filepath=os.path.join(root,f)try:withopen(filepath,"rb")asfh:file_hash=hashlib.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_extensions=None):"""按年月归档文件(适合照片、截图等)"""iffile_extensionsisNone:file_extensions=[".jpg",".jpeg",".png",".gif",".mp4"]moved=0forfinos.listdir(directory):filepath=os.path.join(directory,f)ifnotos.path.isfile(filepath):continue# 筛选文件类型_,ext=os.path.splitext(f)ifext.lower()notinfile_extensions:continue# 获取文件修改时间mtime=os.path.getmtime(filepath)file_date=datetime.fromtimestamp(mtime)year_month=file_date.strftime("%Y年%m月")# 创建目标文件夹target_dir=os.path.join(directory,year_month)os.makedirs(target_dir,exist_ok=True)# 移动shutil.move(filepath,os.path.join(target_dir,f))moved+=1print(f"已归档{moved}个文件到{year_month}文件夹")

五、清空空文件夹

defremove_empty_dirs(directory):"""递归删除空文件夹"""removed=0forroot,dirs,filesinos.walk(directory,topdown=False):fordindirs:dirpath=os.path.join(root,d)try:ifnotos.listdir(dirpath):os.rmdir(dirpath)print(f"删除空文件夹:{dirpath}")removed+=1except:passprint(f"共删除{removed}个空文件夹")

六、一键整理桌面

defclean_desktop():"""一键整理桌面"""desktop=os.path.expanduser("~/Desktop")print(f"整理桌面:{desktop}")# 1. 按类型归档auto_sort_files(desktop)# 2. 删除空文件夹remove_empty_dirs(desktop)# 3. 查找重复文件duplicates=find_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_dir=base_dirdefpreview(self):"""预览当前文件统计"""total=0ext_count={}forfinos.listdir(self.base_dir):ifos.path.isfile(os.path.join(self.base_dir,f)):total+=1_,ext=os.path.splitext(f)ext_count[ext]=ext_count.get(ext,0)+1print(f"📁{self.base_dir}")print(f"📄 共{total}个文件")forext,countinsorted(ext_count.items(),key=lambdax:-x[1])[:10]:print(f"{ext}:{count}个")deforganize(self):"""一键整理"""print("开始整理...")auto_sort_files(self.base_dir)remove_empty_dirs(self.base_dir)print("整理完成!")# 使用org=FileOrganizer("D:/下载")org.preview()org.organize()

总结

文件整理最常用的三个场景:

batch_rename("文件夹","前缀")# 批量重命名auto_sort_files("文件夹")# 按类型归档find_duplicates("文件夹")# 查找重复

建议先dry_run=True预览效果,确认没问题再实际执行。不要一上来就跑删除命令,血的教训。


💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 0:37:36

自建房装电梯避坑清单——井道动工前、施工中、入住后,一次说清楚

一、为什么要有一份“避坑清单”?前面4篇文章,分别讲了“先选电梯再做井道”的顺序逻辑、自用与经营的区分、报价单上的隐藏费用、以及井道动工前必须做好的4件事。但很多业主看完还是会问:“从开始到结束,到底应该怎么做&#xf…

作者头像 李华
网站建设 2026/7/3 0:20:07

音乐文件被平台“绑架“了?3个简单方法帮你找回播放自由

音乐文件被平台"绑架"了?3个简单方法帮你找回播放自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地…

作者头像 李华
网站建设 2026/7/3 0:06:01

3种策略管理Playnite便携版:从基础部署到高级维护的完整指南

3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址…

作者头像 李华
网站建设 2026/7/3 0:05:06

STM32F723ZE与IS31FL3731驱动LED矩阵开发指南

1. IS31FL3731与STM32F723ZE的创意组合:硬件选型解析在LED矩阵控制领域,IS31FL3731是一款颇具特色的驱动芯片。这款来自ISSI的芯片能够控制多达144个LED(16x9矩阵),每个LED可独立进行8位PWM调光。与传统的LED驱动方案相…

作者头像 李华
网站建设 2026/7/2 23:55:00

Selenium性能调优实战:从浏览器配置到等待策略的全面优化指南

1. 项目概述:为什么Selenium需要性能调优?如果你用过Selenium做自动化测试或者数据抓取,大概率经历过这样的场景:脚本跑得慢吞吞,页面加载等半天,一个简单的流程要好几分钟才能走完。尤其是在处理动态加载、…

作者头像 李华