如需要源码,关注微信公众号【爱敲代码的破晓】,后台私信【20260108】
电脑使用久了以后,Download路径下会正在大量的文件,需要不断的手动整理,费时费力。
为此,我利用Python编写了一个脚本实现了文件的自动化整理
废话不多说,直接上代码:
1.导入第三方库
import os
import shutil
import datetime
from pathlib import Path
2.定义需要整理的文件格式
# 文件类型分类字典
self.file_categories = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.ico', '.webp', '.svg'],
'视频': ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv', '.webm', '.m4v', '.mpg', '.mpeg'],
'文档': ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.odt', '.ods', '.odp'],
'压缩文件': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2', '.xz', '.tgz'],
'音乐': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.wma', '.m4a'],
'文本': ['.txt', '.md', '.rtf', '.csv', '.json', '.xml', '.yaml', '.yml'],
'PDF文件': ['.pdf'],
'安装包': ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm', '.apk'],
'电子书': ['.epub', '.mobi', '.azw3', '.fb2'],
'脚本': ['.py', '.sh', '.bat', '.ps1', '.js', '.php', '.java', '.cpp', '.c', '.html', '.css']
}
大家可以更具自己的需求在这个字典里,添加文件格式或文件类型
然而,有时路径下的有些文件不应该被整理,如需系统文件或者配置文件。
3.定义需要排除的文件格式或文件名模式
# 需要排除的文件格式
self.excluded_extensions = [
'.sys', '.dll', '.ini', '.cfg', '.config', '.log', '.tmp', '.temp',
'.db', '.sqlite', '.lock', '.pid', '.swp', '.swo', '.DS_Store'
]
# 需要排除的特定文件名模式
self.excluded_patterns = [
'desktop.ini', 'thumbs.db', '.gitignore', '.gitattributes',
'package-lock.json', 'yarn.lock', 'requirements.txt'
]
同时,为了保证电脑运行不存问题,对于不上字典或需要排除的文件,我们对其不操作。
4.定义文件扩展名识别模块
def get_file_category(self, file_extension, filename):
"""
根据文件扩展名确定文件类别
Args:
file_extension (str): 文件扩展名
filename (str): 文件名
Returns:
str: 文件类别,如果不匹配则返回 None
"""
# 检查是否在排除列表中
if file_extension.lower() in self.excluded_extensions:
return None
# 检查是否匹配排除的文件名模式
if filename.lower() in self.excluded_patterns:
return None
# 匹配文件类别
for category, extensions in self.file_categories.items():
if file_extension.lower() in extensions:
return category
return None
5.文件整理模块
def organize_files(self):
"""
整理目标路径下的文件
"""
print(f"开始整理路径: {self.target_path}")
self.log_entries.append(f"文件整理开始时间: {datetime.datetime.now()}")
self.log_entries.append(f"目标路径: {self.target_path}")
# 统计信息
stats = {
'total': 0,
'moved': 0,
'skipped': 0,
'categories': {category: 0 for category in self.file_categories.keys()}
}
try:
# 遍历目标路径下的所有文件
for item in self.target_path.iterdir():
if item.is_file(): # 只处理文件,不处理文件夹
stats['total'] += 1
filename = item.name
# 获取文件类别
category = self.get_file_category(file_extension, filename)
if category:
# 创建分类文件夹
category_folder = self.target_path / category
category_folder.mkdir(exist_ok=True)
# 构建目标文件路径
destination = category_folder / filename
# 处理同名文件
if destination.exists():
# 如果目标文件已存在,添加时间戳重命名
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
name_without_ext = item.stem
new_filename = f"{name_without_ext}_{timestamp}{file_extension}"
destination = category_folder / new_filename
try:
# 移动文件
shutil.move(str(item), str(destination))
stats['moved'] += 1
stats['categories'][category] += 1
log_message = f"[移动] {filename} -> {category}/{destination.name}"
self.log_entries.append(log_message)
print(log_message)
except Exception as e:
error_message = f"[错误] 无法移动文件 {filename}: {str(e)}"
self.log_entries.append(error_message)
print(error_message)
stats['skipped'] += 1
else:
# 不需要操作的文件
reason = "系统/排除文件" if (file_extension.lower() in self.excluded_extensions or
filename.lower() in self.excluded_patterns) else "未知文件类型"
log_message = f"[跳过] {filename} - 原因: {reason}"
self.log_entries.append(log_message)
print(log_message)
stats['skipped'] += 1
except Exception as e:
error_message = f"整理过程中发生错误: {str(e)}"
self.log_entries.append(error_message)
print(error_message)
# 添加统计信息到日志
self.log_entries.append("-" * 50)
self.log_entries.append("整理统计:")
self.log_entries.append(f"总文件数: {stats['total']}")
self.log_entries.append(f"已移动文件数: {stats['moved']}")
self.log_entries.append(f"跳过文件数: {stats['skipped']}")
self.log_entries.append("")
self.log_entries.append("按类别统计:")
for category, count in stats['categories'].items():
if count > 0:
self.log_entries.append(f" {category}: {count} 个文件")
self.log_entries.append("")
self.log_entries.append(f"文件整理结束时间: {datetime.datetime.now()}")
# 保存日志文件
self.save_log()
print(f"\n整理完成! 日志已保存到: {self.log_file}")
return stats
6.文件整理日志记录并保存
def save_log(self):
"""
保存操作日志到txt文件
"""
try:
with open(self.log_file, 'w', encoding='utf-8') as f:
for entry in self.log_entries:
f.write(entry + '\n')
print(f"日志文件已保存: {self.log_file}")
except Exception as e:
print(f"保存日志文件时出错: {str(e)}")
一下是运行完成后控制台输出结果:

1万+

被折叠的 条评论
为什么被折叠?



