为什么你需要批量整理文件?
下载文件夹乱成一团、桌面堆满截图、照片按日期散落各处……这些场景你一定不陌生。
手动整理耗时耗力,而Python几行代码就能搞定。今天这篇博客,我会从最常见的3个场景出发,给你可直接运行的代码,拿来就能用。
场景一:按文件类型自动分类
这是最实用的场景。把"下载"文件夹里的文件,按后缀名自动分到对应文件夹。
importosimportshutildefsort_by_extension(target_dir):# 文件类型与文件夹的映射type_map={'图片':['.jpg','.jpeg','.png','.gif','.bmp','.svg'],'文档':['.pdf','.doc','.docx','.xls','.xlsx','.ppt','.pptx','.txt'],'视频':['.mp4','.avi','.mkv','.mov','.wmv'],'音频':['.mp3','.wav','.flac','.aac'],'压缩包':['.zip','.rar','.7z','.tar','.gz'],'代码':['.py','.js','.html','.css','.java','.c']}forfilenameinos.listdir(target_dir):file_path=os.path.join(target_dir,filename)ifnotos.path.isfile(file_path):continueext=os.path.splitext(filename)[1].lower()moved=Falseforfolder,extensionsintype_map.items():ifextinextensions:folder_path=os.path.join(target_dir,folder)os.makedirs(folder_path,exist_ok=True)shutil.move(file_path,os.path.join(folder_path,filename))moved=Truebreakifnotmoved:other_path=os.path.join(target_dir,'其他')os.makedirs(other_path,exist_ok=True)shutil.move(file_path,os.path.join(other_path,filename))# 使用sort_by_extension(r'C:\Users\你的用户名\Downloads')运行前注意: 把路径换成你自己的文件夹路径。建议先在测试文件夹上跑一遍。
场景二:按日期整理照片/文件
照片按拍摄日期分类,是另一个高频需求。
importosimportshutilfromdatetimeimportdatetimedefsort_by_date(target_dir,date_from='exif'):forfilenameinos.listdir(target_dir):file_path=os.path.join(target_dir,filename)ifnotos.path.isfile(file_path):continue# 方式1:从文件名提取日期(如 2026-06-20_photo.jpg)try:date_str=filename.split('_')[0]# 2026-06-20date_obj=datetime.strptime(date_str,'%Y-%m-%d')except:# 方式2:从文件修改时间获取date_obj=datetime.fromtimestamp(os.path.getmtime(file_path))folder_name=date_obj.strftime('%Y-%m')# 2026-06folder_path=os.path.join(target_dir,folder_name)os.makedirs(folder_path,exist_ok=True)shutil.move(file_path,os.path.join(folder_path,filename))# 使用sort_by_date(r'D:\照片')提示: 如果你的照片有EXIF信息(拍摄日期),可以用
piexif或Pillow库读取真实拍摄时间,比文件名更准确。
场景三:批量重命名
文件名乱七八糟?统一格式一键搞定。
importosdefbatch_rename(target_dir,prefix='文件',start=1):files=[fforfinos.listdir(target_dir)ifos.path.isfile(os.path.join(target_dir,f))]fori,filenameinenumerate(files,start=start):ext=os.path.splitext(filename)[1]new_name=f"{prefix}_{i:03d}{ext}"# 文件_001.jpgold_path=os.path.join(target_dir,filename)new_path=os.path.join(target_dir,new_name)os.rename(old_path,new_path)print(f"{filename}→{new_name}")# 使用batch_rename(r'C:\Users\你的用户名\Desktop\截图',prefix='截图',start=1)输出示例:
screenshot_abc.png → 截图_001.png 屏幕快照 2026-06-20.png → 截图_002.png几个实用建议
| 建议 | 说明 |
|---|---|
| 先备份再操作 | 批量操作不可逆,建议先复制一份原文件 |
用os.makedirs(exist_ok=True) | 避免文件夹已存在时报错 |
shutil.move比os.rename更安全 | 跨磁盘移动时os.rename会失败 |
加try/except包装 | 实际文件中可能有特殊字符或权限问题 |
最后
批量整理文件的核心逻辑就三步:
- 遍历文件夹中的文件
- 判断分类规则(类型/日期/名称)
- 移动或重命名到目标位置
上面的代码可以直接复制使用,根据自己的需求改一下路径和规则就行。
如果你的需求更复杂(比如按文件大小分类、重复文件检测),可以在评论区说,我帮你写。