Python中如何实现一个整理文档的小工具?
电脑的下载目录总是被塞得很满,又不想去清理,于是写了个小工具进行日常整理,将文件按日期分类存放, github gist 链接: https://gist.github.com/preytaren/3983295d523f099615e5a5ff9233988f
Python中如何实现一个整理文档的小工具?
3 回复
import os
import shutil
from datetime import datetime
import mimetypes
class DocumentOrganizer:
def __init__(self, source_dir, target_dir=None):
"""
文档整理工具
:param source_dir: 源目录路径
:param target_dir: 目标目录路径(可选)
"""
self.source_dir = os.path.abspath(source_dir)
self.target_dir = target_dir or os.path.join(source_dir, "Organized_Docs")
# 创建目标目录
os.makedirs(self.target_dir, exist_ok=True)
# 文件类型分类映射
self.file_categories = {
'images': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
'documents': ['.pdf', '.doc', '.docx', '.txt', '.md', '.rtf'],
'spreadsheets': ['.xls', '.xlsx', '.csv'],
'presentations': ['.ppt', '.pptx'],
'archives': ['.zip', '.rar', '.7z', '.tar', '.gz'],
'code': ['.py', '.js', '.html', '.css', '.java', '.cpp'],
'audio': ['.mp3', '.wav', '.flac'],
'video': ['.mp4', '.avi', '.mov', '.mkv']
}
def get_file_category(self, filename):
"""根据扩展名获取文件分类"""
_, ext = os.path.splitext(filename)
ext = ext.lower()
for category, extensions in self.file_categories.items():
if ext in extensions:
return category
return 'others'
def organize_by_category(self):
"""按文件类型分类整理"""
print(f"开始整理目录: {self.source_dir}")
for item in os.listdir(self.source_dir):
source_path = os.path.join(self.source_dir, item)
# 跳过目录
if os.path.isdir(source_path):
continue
# 获取文件分类
category = self.get_file_category(item)
category_dir = os.path.join(self.target_dir, category)
# 创建分类目录
os.makedirs(category_dir, exist_ok=True)
# 构建目标路径
target_path = os.path.join(category_dir, item)
# 处理重名文件
counter = 1
while os.path.exists(target_path):
name, ext = os.path.splitext(item)
target_path = os.path.join(category_dir, f"{name}_{counter}{ext}")
counter += 1
# 移动文件
shutil.move(source_path, target_path)
print(f"已移动: {item} -> {category}/")
print(f"整理完成!文件已保存到: {self.target_dir}")
def organize_by_date(self, date_format="%Y-%m"):
"""按日期整理(按年月)"""
print("按日期整理文件...")
for item in os.listdir(self.source_dir):
source_path = os.path.join(self.source_dir, item)
if os.path.isdir(source_path):
continue
# 获取文件修改时间
mtime = os.path.getmtime(source_path)
date_str = datetime.fromtimestamp(mtime).strftime(date_format)
# 创建日期目录
date_dir = os.path.join(self.target_dir, date_str)
os.makedirs(date_dir, exist_ok=True)
# 移动文件
target_path = os.path.join(date_dir, item)
shutil.move(source_path, target_path)
print(f"已按日期移动: {item} -> {date_str}/")
def create_index_file(self):
"""创建索引文件"""
index_path = os.path.join(self.target_dir, "index.txt")
with open(index_path, 'w', encoding='utf-8') as f:
f.write("文件整理索引\n")
f.write("=" * 50 + "\n")
for root, dirs, files in os.walk(self.target_dir):
# 跳过索引文件本身
if "index.txt" in files:
files.remove("index.txt")
level = root.replace(self.target_dir, '').count(os.sep)
indent = ' ' * 2 * level
f.write(f"{indent}{os.path.basename(root)}/\n")
sub_indent = ' ' * 2 * (level + 1)
for file in files:
f.write(f"{sub_indent}{file}\n")
print(f"索引文件已创建: {index_path}")
# 使用示例
if __name__ == "__main__":
# 设置要整理的目录
source_directory = "/path/to/your/documents" # 修改为你的目录路径
# 创建整理器实例
organizer = DocumentOrganizer(source_directory)
# 按类型整理
organizer.organize_by_category()
# 创建索引
organizer.create_index_file()
# 如果要按日期整理,取消下面注释
# organizer.organize_by_date()
这个工具提供了两种整理方式:按文件类型分类和按修改日期整理。核心思路是遍历目录,根据文件扩展名或修改时间创建对应的子目录,然后移动文件。get_file_category()方法通过扩展名映射将文件分类,organize_by_category()执行分类整理,organize_by_date()按年月整理。使用前记得修改source_directory为你的实际路径。
用之前先备份重要文件。
好玩~不过感觉按照月份就够了,不然我要找的话,得思考一下是 7.17 号下载的还是 7.16 号下载的…


