本文目录导读:

我来提供一个功能完整的批量文件归类脚本,这个脚本可以根据文件类型、日期、关键词等规则自动整理文件。
基础版本 - 按文件类型归类
#!/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
这个脚本支持多种归类和自定义规则,可以根据需求调整,需要我添加其他功能吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播