桌面堆满文件,找东西要翻半天?Python三分钟帮你分门别类自动归档!
一、先看这个真实场景
李老师的电脑桌面是这样的:
想找一个文件? 眼睛都要瞎了!
以前他整理文件:
一上午又没了!
二、Python的“整理大师”魔法
今天教你用Python自动扫描文件夹,一键整理所有文件:
import osimport shutilfrom datetime import datetime# 设置要整理的文件夹(比如桌面)目标文件夹 = r'C:\Users\你的用户名\Desktop'# 改成你的桌面路径# 魔法开始!遍历所有文件for 文件名 in os.listdir(目标文件夹): 文件路径 = os.path.join(目标文件夹, 文件名)# 跳过文件夹本身if os.path.isdir(文件路径):continue# 获取文件修改时间 修改时间戳 = os.path.getmtime(文件路径) 修改日期 = datetime.fromtimestamp(修改时间戳)# 创建年份文件夹(如:2023) 年份文件夹 = os.path.join(目标文件夹, str(修改日期.year))if not os.path.exists(年份文件夹): os.mkdir(年份文件夹)# 创建月份文件夹(如:01月) 月份文件夹 = os.path.join(年份文件夹, f'{修改日期.month:02d}月')if not os.path.exists(月份文件夹): os.mkdir(月份文件夹)# 移动文件到对应月份文件夹 shutil.move(文件路径, os.path.join(月份文件夹, 文件名))print("✅ 整理完成!所有文件已按年月归档!")
看懂了吗?
- os.path.getmtime():获取文件最后修改时间
- datetime.fromtimestamp():把时间戳转成日期
运行后效果:
Desktop/├── 2025/│ ├── 01月/│ │ ├── 成绩表.xlsx│ │ └── 通知.docx│ ├── 02月/│ │ └── 照片.jpg│ └── 03月/│ └── 会议记录.txt└── 2026/ └── 01月/ └── 新建文档.docx
从此告别混乱!
三、分解“魔法”:每步在干什么?
3.1 第一步:导入需要的库
import os # 文件和文件夹操作import shutil # 移动文件from datetime import datetime # 日期处理
3.2 第二步:指定要整理的文件夹
目标文件夹 = r'C:\Users\你的用户名\Desktop'
注意:路径前的 r 表示原始字符串,防止反斜杠被转义。记得把路径改成你自己的!
3.3 第三步:遍历所有文件
for 文件名 in os.listdir(目标文件夹): 文件路径 = os.path.join(目标文件夹, 文件名)# 跳过文件夹,只处理文件if os.path.isdir(文件路径):continue
- os.listdir():返回文件夹里所有文件和文件夹的名字列表
- os.path.join():把文件夹路径和文件名拼成完整路径
- os.path.isdir():检查路径是不是文件夹,是的话跳过
3.4 第四步:获取文件修改时间
修改时间戳 = os.path.getmtime(文件路径)修改日期 = datetime.fromtimestamp(修改时间戳)
- os.path.getmtime():返回文件最后修改的时间戳(从1970.1.1开始的秒数)
- datetime.fromtimestamp():把时间戳转成我们看得懂的日期对象
3.5 第五步:创建年份文件夹
年份文件夹 = os.path.join(目标文件夹, str(修改日期.year))if not os.path.exists(年份文件夹): os.mkdir(年份文件夹)
3.6 第六步:创建月份文件夹
月份文件夹 = os.path.join(年份文件夹, f'{修改日期.month:02d}月')if not os.path.exists(月份文件夹): os.mkdir(月份文件夹)
- f'{修改日期.month:02d}月':月份格式化为两位数,如 01月、12月
3.7 第七步:移动文件
shutil.move(文件路径, os.path.join(月份文件夹, 文件名))
- shutil.move():将文件移动到目标文件夹
- 如果目标位置已有同名文件,会覆盖吗?会! 所以最好先检查一下,后面会讲怎么处理重名。
四、自己动手试试!
4.1 第一步:创建测试文件夹
在你的桌面上新建一个文件夹叫 测试整理,里面放一些乱七八糟的文件:
import os测试文件夹 = r'C:\Users\你的用户名\Desktop\测试整理'os.makedirs(测试文件夹, exist_ok=True)# 创建几个测试文件for i in range(5): with open(os.path.join(测试文件夹, f'文件{i}.txt'), 'w') as f: f.write('测试内容')print("✅ 测试文件夹已创建")
4.2 第二步:运行整理脚本
把上面的整理代码中的 目标文件夹 改成你的 测试整理 路径,然后运行。
看看效果:所有文件是不是按当前日期的年份和月份放进去了?
五、办公实战1:按文件类型分类整理
有时候我们更习惯按文件类型分类(图片、文档、表格等):
import osimport shutil目标文件夹 = r'C:\Users\你的用户名\Desktop'# 定义文件类型对应的文件夹类型映射 = {'.jpg': '图片', '.jpeg': '图片', '.png': '图片', '.gif': '图片','.doc': '文档', '.docx': '文档', '.txt': '文档', '.pdf': '文档','.xls': '表格', '.xlsx': '表格', '.csv': '表格','.mp3': '音乐', '.mp4': '视频', '.avi': '视频','.zip': '压缩包', '.rar': '压缩包', '.7z': '压缩包'}for 文件名 in os.listdir(目标文件夹): 文件路径 = os.path.join(目标文件夹, 文件名)if os.path.isdir(文件路径):continue# 获取文件扩展名(小写) 扩展名 = os.path.splitext(文件名)[1].lower()# 根据扩展名确定目标文件夹 目标类型 = 类型映射.get(扩展名, '其他')# 创建类型文件夹 类型文件夹 = os.path.join(目标文件夹, 目标类型)if not os.path.exists(类型文件夹): os.mkdir(类型文件夹)# 移动文件 shutil.move(文件路径, os.path.join(类型文件夹, 文件名))print("✅ 按文件类型整理完成!")
效果:
Desktop/├── 图片/│ ├── 照片1.jpg│ └── 截图.png├── 文档/│ ├── 报告.docx│ └── 笔记.txt├── 表格/│ └── 成绩表.xlsx└── 其他/ └── 未知文件.abc
六、办公实战2:按文件名中的日期整理
很多文件命名包含日期,比如 2025-05-12 会议记录.docx,我们可以提取这个日期来分类:
import osimport shutilimport refrom datetime import datetime目标文件夹 = r'C:\Users\你的用户名\Desktop'def 从文件名提取日期(文件名):"""尝试从文件名中提取日期,返回日期对象或None"""# 匹配 yyyy-mm-dd 或 yyyymmdd 格式 match = re.search(r'(\d{4})[-_]?(\d{2})[-_]?(\d{2})', 文件名)if match: try:return datetime(int(match.group(1)), int(match.group(2)), int(match.group(3))) except:return Nonereturn Nonefor 文件名 in os.listdir(目标文件夹): 文件路径 = os.path.join(目标_folder, 文件名)if os.path.isdir(文件路径):continue# 尝试从文件名提取日期 文件日期 = 从文件名提取日期(文件名)if 文件日期:# 用提取的日期创建文件夹 年份 = 文件日期.year 月份 = 文件日期.monthelse:# 提取失败则用修改日期 修改时间戳 = os.path.getmtime(文件路径) 文件日期 = datetime.fromtimestamp(修改时间戳) 年份 = 文件日期.year 月份 = 文件日期.month# 创建年份文件夹 年份文件夹 = os.path.join(目标文件夹, str(年份))if not os.path.exists(年份文件夹): os.mkdir(年份_folder)# 创建月份文件夹 月份文件夹 = os.path.join(年份文件夹, f'{月份:02d}月')if not os.path.exists(月份文件夹): os.mkdir(月份文件夹) shutil.move(文件路径, os.path.join(月份文件夹, 文件名))print("✅ 按文件名日期整理完成!")
正则表达式:
- r'(\d{4})[-]?(\d{2})[-]?(\d{2})':匹配4位数字,可能跟分隔符-或_,再2位数字,再分隔符,再2位数字
七、高级技巧:处理重名文件
如果移动时目标文件夹已有同名文件,直接移动会覆盖。我们可以自动重命名:
def 获取不重复文件名(目标文件夹, 文件名):"""如果文件已存在,在文件名后加(1)、(2)等""" 基础名, 扩展名 = os.path.splitext(文件名) 计数器 = 1 新文件名 = 文件名while os.path.exists(os.path.join(目标文件夹, 新文件名)): 新文件名 = f'{基础名}({计数器}){扩展名}' 计数器 += 1return 新文件名# 在移动之前调用:新文件名 = 获取不重复文件名(月份文件夹, 文件名)shutil.move(文件路径, os.path.join(月份文件夹, 新文件名))
八、实战升级:一键整理下载文件夹
把上面的代码整合成一个函数,专门清理你的下载文件夹:
import osimport shutilfrom datetime import datetimedef 整理文件夹(路径, 按='年月'):"""整理指定路径下的文件 Args: 路径: 要整理的文件夹路径 按: '年月' 或 '类型' """print(f"开始整理:{路径}")# 定义类型映射(可按需修改) 类型映射 = {'.jpg': '图片', '.jpeg': '图片', '.png': '图片', '.gif': '图片','.doc': '文档', '.docx': '文档', '.txt': '文档', '.pdf': '文档','.xls': '表格', '.xlsx': '表格', '.csv': '表格','.mp3': '音乐', '.mp4': '视频', '.avi': '视频','.zip': '压缩包', '.rar': '压缩包', '.7z': '压缩包' } 计数 = 0for 文件名 in os.listdir(路径): 文件路径 = os.path.join(路径, 文件名)if os.path.isdir(文件_path):continueif 按 == '年月':# 按修改时间分类 修改时间戳 = os.path.getmtime(文件路径) 修改日期 = datetime.fromtimestamp(修改时间戳) 年份 = 修改日期.year 月份 = 修改日期.month 目标父文件夹 = os.path.join(路径, str(年份)) 目标子文件夹 = os.path.join(目标父文件夹, f'{月份:02d}月')elif 按 == '类型':# 按文件类型分类 扩展名 = os.path.splitext(文件名)[1].lower() 类型 = 类型映射.get(扩展名, '其他') 目标父文件夹 = 路径 目标子文件夹 = os.path.join(路径, 类型)else:print("不支持的分组方式")return# 创建文件夹if not os.path.exists(目标子文件夹): os.makedirs(目标子文件夹)# 处理重名 基础名, 扩展名 = os.path.splitext(文件名) 新文件名 = 文件名 计数器 = 1while os.path.exists(os.path.join(目标子文件夹, 新文件名)): 新文件名 = f'{基础名}({计数器}){扩展名}' 计数器 += 1# 移动文件 shutil.move(文件路径, os.path.join(目标子文件夹, 新文件名)) 计数 += 1print(f"移动:{文件名} -> {目标子folder}")print(f"✅ 整理完成!共移动{计数}个文件")# 使用示例整理文件夹(r'C:\Users\你的用户名\Downloads', 按='类型')
九、重点总结:今天你学会了什么?
✅ 核心技能
- os.path.getmtime() - 获取文件修改时间
- datetime.fromtimestamp() - 时间戳转日期
- os.mkdir() / os.makedirs() - 创建文件夹
✅ 办公应用场景
- 照片整理:按拍摄日期(EXIF信息)分类(可扩展)
✅ 效率对比
十、今日挑战:动手做!
任务1:按文件大小分类
# 修改上面的代码,按文件大小分成小文件(<1MB)、中文件(1-10MB)、大文件(>10MB)# 提示:用 os.path.getsize() 获取文件大小(字节)
任务2:整理照片,按拍摄日期(需要读取EXIF)
# 提示:需要安装 exifread 或 pillow 库# from PIL import Image# 用 Image.open(照片路径)._getexif() 获取拍摄日期
任务3:自动整理指定类型的文件到不同文件夹
# 例如:把桌面所有的 .docx 和 .xlsx 移到“工作文档”文件夹# 把所有的 .jpg 和 .png 移到“照片”文件夹
十一、明日预告
明天学自动化办公终极武器——批量重命名神器!
让你的文件管理如虎添翼!
回复「Py-Day」获取今日挑战题解及完整代码。
评论区作业:晒出你整理前后的文件夹对比图,看看谁的最整齐!👇