本文目录导读:

我来提供一个功能完整的批量文件归类脚本,这个脚本可以根据文件类型、日期、关键词等规则自动整理文件。
基础版本 - 按文件类型归类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量文件归类脚本 - 按文件类型
"""
import os
import shutil
from pathlib import Path
# 文件类型分类规则
FILE_CATEGORIES = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp', '.ico'],
'视频': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm'],
'音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a'],
'文档': ['.pdf', '.doc', '.docx', '.txt', '.md', '.ppt', '.pptx', '.xls', '.xlsx'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2'],
'代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.c', '.php', '.json', '.xml'],
'安装包': ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm'],
'其他': [] # 默认归类的类型
}
def organize_files(source_dir, target_dir=None):
"""
按文件类型整理文件
Args:
source_dir: 源文件夹路径
target_dir: 目标文件夹路径(默认使用源文件夹)
"""
source_path = Path(source_dir)
target_path = Path(target_dir) if target_dir else source_path
if not source_path.exists():
print(f"错误:源文件夹 {source_dir} 不存在")
return
# 统计信息
stats = {"moved": 0, "failed": 0}
# 遍历源文件夹中的所有文件
for item in source_path.iterdir():
if item.is_file():
# 获取文件扩展名
file_ext = item.suffix.lower()
# 确定文件类别
category = "其他"
for cat, extensions in FILE_CATEGORIES.items():
if file_ext in extensions:
category = cat
break
# 创建目标文件夹
category_dir = target_path / category
category_dir.mkdir(exist_ok=True)
# 移动文件
try:
dest_path = category_dir / item.name
# 处理重名文件
if dest_path.exists():
base_name = item.stem
counter = 1
while dest_path.exists():
dest_path = category_dir / f"{base_name}_{counter}{file_ext}"
counter += 1
shutil.move(str(item), str(dest_path))
print(f"✓ 移动: {item.name} -> {category}/")
stats["moved"] += 1
except Exception as e:
print(f"✗ 失败: {item.name} - {str(e)}")
stats["failed"] += 1
# 打印统计信息
print("\n" + "="*50)
print(f"文件归类完成!")
print(f"成功移动: {stats['moved']} 个文件")
print(f"失败: {stats['failed']} 个文件")
print("="*50)
# 使用示例
if __name__ == "__main__":
# 指定要整理的文件夹
source_folder = input("请输入要整理的文件夹路径: ").strip()
# 可选择是否指定目标文件夹
target_folder = input("请输入目标文件夹路径(直接回车使用原文件夹): ").strip()
organize_files(source_folder, target_folder if target_folder else None)
高级版本 - 多功能归类脚本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高级批量文件归类脚本
支持按类型、日期、关键词、大小等多种方式整理
"""
import os
import shutil
from pathlib import Path
from datetime import datetime
import re
import json
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('file_organizer.log', encoding='utf-8'),
logging.StreamHandler()
]
)
class FileOrganizer:
"""文件归类管理器"""
def __init__(self, source_dir):
self.source_dir = Path(source_dir)
self.logger = logging.getLogger(__name__)
self.stats = {"moved": 0, "failed": 0, "skipped": 0}
# 配置文件规则
self.rules = {
"image_extensions": ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
"video_extensions": ['.mp4', '.avi', '.mkv', '.mov', '.wmv'],
"document_extensions": ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.pptx'],
"archive_extensions": ['.zip', '.rar', '.7z', '.tar', '.gz'],
"code_extensions": ['.py', '.js', '.html', '.css', '.java', '.cpp']
}
def organize_by_type(self, target_dir=None):
"""按文件类型整理"""
target = Path(target_dir) if target_dir else self.source_dir
self.logger.info("开始按类型整理文件...")
for file_path in self.source_dir.iterdir():
if file_path.is_file():
category = self._get_file_type(file_path)
self._move_file(file_path, target / category)
self._print_summary("按类型整理")
def organize_by_date(self, target_dir=None):
"""按文件修改日期整理(年/月)"""
target = Path(target_dir) if target_dir else self.source_dir
self.logger.info("开始按日期整理文件...")
for file_path in self.source_dir.iterdir():
if file_path.is_file():
mtime = datetime.fromtimestamp(file_path.stat().st_mtime)
date_dir = target / str(mtime.year) / f"{mtime.month:02d}月"
self._move_file(file_path, date_dir)
self._print_summary("按日期整理")
def organize_by_keywords(self, keyword_mapping, target_dir=None):
"""
按关键词整理文件
Args:
keyword_mapping: 如 {"工作": ["报告", "项目", "会议"]}
target_dir: 目标文件夹
"""
target = Path(target_dir) if target_dir else self.source_dir
self.logger.info("开始按关键词整理文件...")
# 添加到"其他"类别
keyword_mapping.setdefault("其他", [])
for file_path in self.source_dir.iterdir():
if file_path.is_file():
matched = False
for folder_name, keywords in keyword_mapping.items():
if any(keyword.lower() in file_path.stem.lower()
for keyword in keywords):
self._move_file(file_path, target / folder_name)
matched = True
break
# 未匹配的文件放到"其他"
if not matched:
self._move_file(file_path, target / "其他")
self._print_summary("按关键词整理")
def organize_by_size(self, size_thresholds, target_dir=None):
"""
按文件大小整理
Args:
size_thresholds: 如 {"小文件(<1MB)": 1048576, "中等(1-10MB)": 10485760}
target_dir: 目标文件夹
"""
target = Path(target_dir) if target_dir else self.source_dir
self.logger.info("开始按大小整理文件...")
for file_path in self.source_dir.iterdir():
if file_path.is_file():
size = file_path.stat().st_size
category = "超大文件"
for folder_name, threshold in size_thresholds.items():
if size <= threshold:
category = folder_name
break
self._move_file(file_path, target / category)
self._print_summary("按大小整理")
def _get_file_type(self, file_path):
"""获取文件类型"""
ext = file_path.suffix.lower()
for category, extensions in self.rules.items():
if ext in extensions:
category = category.replace("_extensions", "").capitalize()
return category
return "其他"
def _move_file(self, file_path, dest_dir):
"""移动文件到目标目录"""
try:
# 创建目标目录
dest_dir.mkdir(parents=True, exist_ok=True)
# 处理重名文件
dest_path = dest_dir / file_path.name
if dest_path.exists():
base_name = file_path.stem
counter = 1
while dest_path.exists():
new_name = f"{base_name}_{counter}{file_path.suffix}"
dest_path = dest_dir / new_name
counter += 1
# 移动文件
shutil.move(str(file_path), str(dest_path))
self.stats["moved"] += 1
self.logger.info(f"移动: {file_path.name} -> {dest_dir.name}/")
except Exception as e:
self.stats["failed"] += 1
self.logger.error(f"移动失败: {file_path.name} - {str(e)}")
def _print_summary(self, mode):
"""打印统计摘要"""
summary = f"""
╔══════════════════════════════════════╗
║ 文件归类完成报告 ║
╠══════════════════════════════════════╣
║ 整理方式: {mode.ljust(20)}║
║ 成功移动: {str(self.stats["moved"]).ljust(19)}║
║ 失败文件: {str(self.stats["failed"]).ljust(19)}║
╚══════════════════════════════════════╝
"""
print(summary)
self.logger.info(f"归类完成: 移动{self.stats['moved']}个, 失败{self.stats['failed']}个")
# 使用示例
def run_example():
"""运行示例"""
folder = input("请输入要整理的文件夹路径: ").strip()
while True:
print("\n请选择整理方式:")
print("1. 按文件类型整理")
print("2. 按日期整理")
print("3. 按关键词整理")
print("4. 按大小整理")
print("5. 退出")
choice = input("请输入选项(1-5): ")
if choice == "1":
FileOrganizer(folder).organize_by_type()
elif choice == "2":
FileOrganizer(folder).organize_by_date()
elif choice == "3":
# 自定义关键词规则
rules = {
"工作": ["报告", "项目", "会议"],
"学习": ["笔记", "教程", "课件"],
"生活": ["照片", "旅行"],
"其他": []
}
FileOrganizer(folder).organize_by_keywords(rules)
elif choice == "4":
# 自定义大小规则 (字节)
size_rules = {
"小文件(<1MB)": 1048576,
"中等(1-10MB)": 10485760,
"大文件(10-100MB)": 104857600,
"超大文件(>100MB)": float('inf')
}
FileOrganizer(folder).organize_by_size(size_rules)
elif choice == "5":
print("再见!")
break
else:
print("无效选项,请重新输入")
if __name__ == "__main__":
run_example()
脚本使用说明
安装依赖
# 如果没有安装需要 pip install pathlib # Python 3.4+ 自带
使用方法
-
基础使用:
python file_organizer.py
-
自定义规则:修改脚本中的规则配置
folder/
├── 图片/ # .jpg, .png 等
├── 视频/ # .mp4, .avi 等
├── 文档/ # .pdf, .doc 等
├── 代码/ # .py, .js 等
└── 其他/ # 未分类文件
安全提示
- 备份重要文件:首次使用建议在测试文件夹中运行
- 权限问题:确保有读写权限
- 路径格式:Windows使用
C:\path,Linux/Mac使用/path
这个脚本支持多种归类和自定义规则,可以根据需求调整,需要我添加其他功能吗?