怎样编写文件整理脚本

wen 实用脚本 35

本文目录导读:

怎样编写文件整理脚本

  1. 基础功能版:按文件类型整理
  2. 进阶版:按日期整理
  3. 完整功能版:带文件过滤和日志
  4. 使用示例
  5. 实用提示

我来帮你编写一个文件整理脚本,这是一个非常实用的自动化工具,可以帮你按类型、日期等规则整理文件。

基础功能版:按文件类型整理

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

实用提示

  1. 先备份:运行整理脚本前,确保重要文件已备份
  2. 测试运行:先用 --dry-run 参数查看即将执行的操作
  3. 自定义规则:可以根据需要修改 file_types 字典来添加新的文件类型分类
  4. 日志查看:查看 file_organizer.log 了解详细的操作记录

这个脚本可以帮助你快速整理杂乱的下载文件夹、桌面或其他目录,需要我添加其他功能吗?

抱歉,评论功能暂时关闭!