本文目录导读:

我来帮你编写一个文件整理脚本,这是一个非常实用的自动化工具,可以帮你按类型、日期等规则整理文件。
基础功能版:按文件类型整理
import os
import shutil
from pathlib import Path
def organize_files_by_type(folder_path):
"""
按文件类型整理文件夹
"""
# 文件类型分类规则
file_types = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp'],
'文档': ['.doc', '.docx', '.pdf', '.txt', '.xlsx', '.pptx', '.md'],
'视频': ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv'],
'音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
'程序': ['.exe', '.msi', '.apk', '.dmg'],
'代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.h'],
}
folder = Path(folder_path)
# 遍历文件夹中的所有文件
for file in folder.iterdir():
if file.is_file():
# 获取文件扩展名
ext = file.suffix.lower()
# 查找对应的分类
moved = False
for category, extensions in file_types.items():
if ext in extensions:
# 创建目标文件夹
target_folder = folder / category
target_folder.mkdir(exist_ok=True)
# 移动文件
target_path = target_folder / file.name
shutil.move(str(file), str(target_path))
print(f'已移动: {file.name} -> {category}')
moved = True
break
# 如果文件类型未识别,放入"其他"文件夹
if not moved:
other_folder = folder / '其他'
other_folder.mkdir(exist_ok=True)
shutil.move(str(file), str(other_folder / file.name))
print(f'已移动: {file.name} -> 其他')
if __name__ == '__main__':
# 使用示例:整理当前目录
organize_files_by_type('./')
进阶版:按日期整理
import os
import shutil
from datetime import datetime
from pathlib import Path
def organize_by_date(folder_path):
"""
按文件创建日期整理文件
"""
folder = Path(folder_path)
for file in folder.iterdir():
if file.is_file():
# 获取文件修改时间
timestamp = os.path.getmtime(file)
file_date = datetime.fromtimestamp(timestamp)
# 创建日期文件夹 (年-月)
date_folder = folder / file_date.strftime('%Y-%m')
date_folder.mkdir(exist_ok=True)
# 移动文件
target_path = date_folder / file.name
# 处理文件名冲突
counter = 1
while target_path.exists():
name = file.stem
ext = file.suffix
target_path = date_folder / f'{name}_{counter}{ext}'
counter += 1
shutil.move(str(file), str(target_path))
print(f'已移动: {file.name} -> {date_folder.name}')
# 使用示例
# organize_by_date('./')
完整功能版:带文件过滤和日志
import os
import shutil
import logging
from pathlib import Path
from datetime import datetime
import argparse
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('file_organizer.log'),
logging.StreamHandler()
]
)
class FileOrganizer:
def __init__(self, folder_path, dry_run=False):
self.folder = Path(folder_path)
self.dry_run = dry_run
self.stats = {'moved': 0, 'skipped': 0, 'errors': 0}
# 文件类型配置
self.file_types = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp'],
'文档': ['.doc', '.docx', '.pdf', '.txt', '.xlsx', '.pptx', '.md'],
'视频': ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv'],
'音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
'程序': ['.exe', '.msi', '.apk', '.dmg'],
'代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.h'],
'数据': ['.csv', '.json', '.xml', '.yaml', '.yml'],
}
def organize_by_type(self):
"""按类型整理文件"""
logging.info(f"开始按类型整理文件夹: {self.folder}")
for file in self.folder.iterdir():
if not file.is_file():
continue
try:
ext = file.suffix.lower()
target_category = self._find_category(ext)
if target_category:
self._move_file(file, target_category)
else:
self._move_file(file, '其他')
except Exception as e:
logging.error(f"处理文件 {file.name} 时出错: {str(e)}")
self.stats['errors'] += 1
self._print_stats()
def organize_by_date(self):
"""按日期整理文件"""
logging.info(f"开始按日期整理文件夹: {self.folder}")
for file in self.folder.iterdir():
if not file.is_file():
continue
try:
timestamp = os.path.getmtime(file)
file_date = datetime.fromtimestamp(timestamp)
date_folder = file_date.strftime('%Y-%m')
self._move_file(file, date_folder)
except Exception as e:
logging.error(f"处理文件 {file.name} 时出错: {str(e)}")
self.stats['errors'] += 1
self._print_stats()
def _find_category(self, ext):
"""查找文件扩展名对应的类别"""
for category, extensions in self.file_types.items():
if ext in extensions:
return category
return None
def _move_file(self, file, target_folder_name):
"""移动文件到目标文件夹"""
target_folder = self.folder / target_folder_name
target_path = target_folder / file.name
# 处理文件名冲突
counter = 1
while target_path.exists():
name = file.stem
ext = file.suffix
target_path = target_folder / f'{name}_{counter}{ext}'
counter += 1
if self.dry_run:
logging.info(f"[模拟] 将移动: {file.name} -> {target_folder_name}")
else:
target_folder.mkdir(exist_ok=True)
shutil.move(str(file), str(target_path))
logging.info(f"已移动: {file.name} -> {target_folder_name}")
self.stats['moved'] += 1
def _print_stats(self):
"""打印统计信息"""
logging.info(f"整理完成! 统计: 移动 {self.stats['moved']} 个文件, "
f"跳过 {self.stats['skipped']} 个, "
f"错误 {self.stats['errors']} 个")
def main():
parser = argparse.ArgumentParser(description='文件整理工具')
parser.add_argument('path', nargs='?', default='.',
help='要整理的文件夹路径')
parser.add_argument('--type', action='store_true',
help='按文件类型整理')
parser.add_argument('--date', action='store_true',
help='按日期整理')
parser.add_argument('--dry-run', action='store_true',
help='模拟运行,不实际移动文件')
args = parser.parse_args()
# 创建整理器并执行
organizer = FileOrganizer(args.path, args.dry_run)
if args.type:
organizer.organize_by_type()
elif args.date:
organizer.organize_by_date()
else:
# 默认按类型整理
organizer.organize_by_type()
if __name__ == '__main__':
main()
使用示例
# 基本用法 - 按类型整理当前目录 python file_organizer.py # 按类型整理指定目录 python file_organizer.py /path/to/folder --type # 按日期整理 python file_organizer.py /path/to/folder --date # 先模拟运行,查看结果 python file_organizer.py /path/to/folder --type --dry-run
实用提示
- 先备份:运行整理脚本前,确保重要文件已备份
- 测试运行:先用
--dry-run参数查看即将执行的操作 - 自定义规则:可以根据需要修改
file_types字典来添加新的文件类型分类 - 日志查看:查看
file_organizer.log了解详细的操作记录
这个脚本可以帮助你快速整理杂乱的下载文件夹、桌面或其他目录,需要我添加其他功能吗?