你的下载文件夹是不是这样
打开下载文件夹,一片混乱:PDF和JPG混在一起,"新建文件夹(3)"套着"新建文件夹(4)",三个月前的文件找不到了。
Python可以帮你自动整理。核心用到三个模块:os(文件和目录操作)、shutil(文件复制移动)、pathlib(更现代的路径操作)。
场景一:自动分类整理文件
import os
import shutil
from pathlib import Path
def auto_organize(folder_path):
"""自动按文件类型分类整理"""
# 文件类型映射
type_map = {
"文档": [".pdf", ".doc", ".docx", ".txt", ".md", ".xlsx", ".pptx"],
"图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg"],
"视频": [".mp4", ".avi", ".mov", ".mkv", ".wmv"],
"音频": [".mp3", ".wav", ".flac", ".aac"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"代码": [".py", ".js", ".html", ".css", ".java", ".cpp"],
}
# 创建分类文件夹
for folder_name in type_map:
target_dir = os.path.join(folder_path, folder_name)
os.makedirs(target_dir, exist_ok=True)
# 遍历并移动文件
organized = 0
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
# 跳过文件夹
if os.path.isdir(file_path):
continue
# 获取扩展名
ext = os.path.splitext(filename)[1].lower()
# 找到对应分类
moved = False
for category, extensions in type_map.items():
if ext in extensions:
target = os.path.join(folder_path, category, filename)
shutil.move(file_path, target)
print(f" {filename} → {category}/")
organized += 1
moved = True
break
if not moved:
print(f" {filename} → 其他/ (未识别类型)")
other_dir = os.path.join(folder_path, "其他")
os.makedirs(other_dir, exist_ok=True)
shutil.move(file_path, os.path.join(other_dir, filename))
print(f"\n整理完成!共处理 {organized} 个文件")
# 使用
auto_organize("C:/Users/你的用户名/Downloads")
场景二:按日期归档
import os
import shutil
from datetime import datetime
def organize_by_date(folder_path):
"""按文件修改日期归档到年/月文件夹"""
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isdir(file_path):
continue
# 获取修改时间
mtime = os.path.getmtime(file_path)
dt = datetime.fromtimestamp(mtime)
# 创建年/月文件夹
year_folder = str(dt.year)
month_folder = f"{dt.month:02d}月"
target_dir = os.path.join(folder_path, year_folder, month_folder)
os.makedirs(target_dir, exist_ok=True)
# 移动
target = os.path.join(target_dir, filename)
shutil.move(file_path, target)
print(f"{filename} → {year_folder}/{month_folder}/")
场景三:批量修改文件名
import os
import re
def batch_rename(folder_path, pattern, replacement):
"""批量替换文件名中的文字"""
count = 0
for filename in os.listdir(folder_path):
# 用正则替换文件名
new_name = re.sub(pattern, replacement, filename)
if new_name != filename:
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f" {filename} → {new_name}")
count += 1
print(f"\n共重命名 {count} 个文件")
# 示例:去掉文件名中的"[副本]"
batch_rename("./文档", r"\[副本\]", "")
# 示例:把文件名中的空格换成下划线
batch_rename("./文档", r"\s+", "_")
场景四:自动备份重要文件
import os
import shutil
from datetime import datetime
def auto_backup(source_dir, backup_dir):
"""自动备份文件夹到指定位置"""
# 创建带时间戳的备份文件夹
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_name = f"backup_{timestamp}"
target = os.path.join(backup_dir, backup_name)
# 复制整个文件夹
shutil.copytree(source_dir, target)
# 统计
total_files = 0
total_size = 0
for root, dirs, files in os.walk(target):
total_files += len(files)
for f in files:
total_size += os.path.getsize(os.path.join(root, f))
size_mb = total_size / (1024 * 1024)
print(f"备份完成!")
print(f" 位置:{target}")
print(f" 文件数:{total_files}")
print(f" 大小:{size_mb:.1f} MB")
# 使用:每天备份工作文档
auto_backup(
"D:/工作文档",
"E:/备份/工作文档备份"
)
进阶:清理过期文件
import os
import time
def clean_old_files(folder_path, days=30):
"""删除超过指定天数的文件"""
cutoff = time.time() - (days * 86400) # 30天前的时间戳
deleted = 0
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path) and os.path.getatime(file_path) < cutoff:
os.remove(file_path)
print(f" 已删除:{filename}")
deleted += 1
print(f"\n清理完成,删除 {deleted} 个过期文件")
提醒:删除操作不可逆,建议先用print预览,确认无误后再执行os.remove。