本文目录导读:

我来教你几种图片批量分类的方法,从简单到复杂:
按文件格式分类(最简单)
import os
import shutil
from pathlib import Path
def classify_by_format(source_folder):
"""按图片格式分类"""
# 创建分类文件夹
formats = {
'.jpg': 'JPEG',
'.jpeg': 'JPEG',
'.png': 'PNG',
'.gif': 'GIF',
'.bmp': 'BMP',
'.webp': 'WebP'
}
# 遍历源文件夹
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if not os.path.isfile(file_path):
continue
# 获取文件扩展名
ext = Path(filename).suffix.lower()
# 如果有对应的分类,移动文件
if ext in formats:
dest_folder = os.path.join(source_folder, formats[ext])
os.makedirs(dest_folder, exist_ok=True)
shutil.move(file_path, os.path.join(dest_folder, filename))
print(f"移动: {filename} -> {formats[ext]}")
# 使用
classify_by_format("你的图片文件夹路径")
按文件大小分类
import os
import shutil
def classify_by_size(source_folder):
"""按图片大小分类"""
categories = {
'小图片_<100KB': 100 * 1024, # <100KB
'中图片_100KB-1MB': 1024 * 1024, # 100KB-1MB
'大图片_>1MB': float('inf') # >1MB
}
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if not os.path.isfile(file_path):
continue
# 获取文件大小
size = os.path.getsize(file_path)
# 按大小分类
for category, size_limit in categories.items():
if size < size_limit:
dest_folder = os.path.join(source_folder, category)
os.makedirs(dest_folder, exist_ok=True)
shutil.move(file_path, os.path.join(dest_folder, filename))
print(f"移动: {filename} -> {category}")
break
# 使用
classify_by_size("你的图片文件夹路径")
按图片尺寸(分辨率)分类
from PIL import Image
import os
import shutil
def classify_by_resolution(source_folder):
"""按图片尺寸分类"""
categories = {
'小尺寸_<800x600': (800, 600),
'中等尺寸_800x600-1920x1080': (1920, 1080),
'大尺寸_>1920x1080': (float('inf'), float('inf'))
}
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if not os.path.isfile(file_path):
continue
try:
# 打开图片获取尺寸
with Image.open(file_path) as img:
width, height = img.size
except:
print(f"无法处理: {filename}")
continue
# 按尺寸分类
for category, (max_w, max_h) in categories.items():
if width < max_w and height < max_h:
dest_folder = os.path.join(source_folder, category)
os.makedirs(dest_folder, exist_ok=True)
shutil.move(file_path, os.path.join(dest_folder, filename))
print(f"移动: {filename} -> {category}")
break
# 需要安装PIL库
# pip install Pillow
classify_by_resolution("你的图片文件夹路径")
按拍摄日期分类(适合照片)
import os
import shutil
from PIL import Image
from datetime import datetime
def classify_by_date(source_folder):
"""按拍摄日期分类"""
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if not os.path.isfile(file_path):
continue
try:
# 获取图片的EXIF信息(拍摄日期)
with Image.open(file_path) as img:
exif = img._getexif()
if exif and 36867 in exif: # 拍摄日期标签
date_str = exif[36867]
date_obj = datetime.strptime(date_str, '%Y:%m:%d %H:%M:%S')
else:
# 使用文件修改日期
file_time = os.path.getmtime(file_path)
date_obj = datetime.fromtimestamp(file_time)
except:
# 使用文件修改日期
file_time = os.path.getmtime(file_path)
date_obj = datetime.fromtimestamp(file_time)
# 按年月分类
year = str(date_obj.year)
month = f"{date_obj.month:02d}月"
dest_folder = os.path.join(source_folder, year, month)
os.makedirs(dest_folder, exist_ok=True)
shutil.move(file_path, os.path.join(dest_folder, filename))
print(f"移动: {filename} -> {year}/{month}")
# 使用
classify_by_date("你的图片文件夹路径")
完整版(带GUI界面)
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import shutil
from PIL import Image
from tkinter import ttk
class ImageClassifier:
def __init__(self, root):
self.root = root
self.root.title("图片批量分类工具")
self.root.geometry("500x400")
# 创建界面
self.setup_ui()
def setup_ui(self):
# 文件夹选择
tk.Label(self.root, text="选择图片文件夹:").pack(pady=10)
self.folder_path = tk.StringVar()
tk.Entry(self.root, textvariable=self.folder_path, width=50).pack()
tk.Button(self.root, text="浏览", command=self.browse_folder).pack(pady=5)
# 分类方式选择
tk.Label(self.root, text="选择分类方式:").pack(pady=10)
self.classify_method = tk.StringVar(value="format")
methods = [
("按格式分类", "format"),
("按大小分类", "size"),
("按分辨率分类", "resolution"),
("按日期分类", "date"),
("按颜色分类", "color")
]
for text, value in methods:
tk.Radiobutton(self.root, text=text, variable=self.classify_method,
value=value).pack()
# 开始按钮
tk.Button(self.root, text="开始分类", command=self.start_classify,
bg="green", fg="white", padx=20, pady=10).pack(pady=20)
# 状态显示
self.status_text = tk.Text(self.root, height=8, width=60)
self.status_text.pack(pady=10)
def browse_folder(self):
folder = filedialog.askdirectory()
if folder:
self.folder_path.set(folder)
def log(self, message):
self.status_text.insert(tk.END, message + "\n")
self.status_text.see(tk.END)
self.root.update()
def start_classify(self):
folder = self.folder_path.get()
if not folder:
messagebox.showerror("错误", "请选择文件夹")
return
method = self.classify_method.get()
self.status_text.delete(1.0, tk.END)
try:
if method == "format":
self.classify_by_format(folder)
elif method == "size":
self.classify_by_size(folder)
elif method == "resolution":
self.classify_by_resolution(folder)
elif method == "date":
self.classify_by_date(folder)
elif method == "color":
self.classify_by_color(folder)
messagebox.showinfo("完成", "图片分类完成!")
except Exception as e:
messagebox.showerror("错误", f"分类出错: {str(e)}")
def classify_by_format(self, folder):
formats = {
'.jpg': 'JPEG',
'.jpeg': 'JPEG',
'.png': 'PNG',
'.gif': 'GIF',
'.bmp': 'BMP',
'.webp': 'WebP'
}
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
if not os.path.isfile(file_path):
continue
ext = os.path.splitext(filename)[1].lower()
if ext in formats:
dest = os.path.join(folder, formats[ext])
os.makedirs(dest, exist_ok=True)
shutil.move(file_path, os.path.join(dest, filename))
self.log(f"移动: {filename} -> {formats[ext]}")
def classify_by_size(self, folder):
# 完整功能实现...
pass # 可以添加其他分类方法的实现
# 运行程序
if __name__ == "__main__":
root = tk.Tk()
app = ImageClassifier(root)
root.mainloop()
使用说明
-
安装依赖(如果需要):
pip install Pillow
-
选择适合的方法:
- 简单分类:方法一(按格式)
- 按文件属性:方法二、三
- 按时间信息:方法四
- 全部功能:方法五(带界面)
-
注意事项:
- 建议先备份原始图片
- 可以先测试小部分文件
- 确保有足够的磁盘空间
选择适合你需求的脚本,修改文件夹路径即可使用!