Python学习 - 面向对象学习-文件分类小测试

python 复制代码
import os
import shutil
import json

class FileOrganizer:
    def __init__(self, log_file="file_move.log"):
        self.log_file = log_file
        self.ensure_log_file()

    # 检查移动日志
    def ensure_log_file(self):
        """确保日志文件存在,如果不存在则创建一个空的 JSON 数组"""
        if not os.path.exists(self.log_file):
            with open(self.log_file, "w", encoding="utf-8") as f:
                json.dump([], f, ensure_ascii=False, indent=4)
            print(f"已创建日志文件: {self.log_file}")
        else:
            print(f"日志文件已存在: {self.log_file}")

    # 文件分类
    def classify_files(self, folder_path):
        """按扩展名分类文件"""
        if not os.path.exists(folder_path):
            print("指定的文件夹不存在")
            return

        move_log = []

        for file_name in os.listdir(folder_path):
            file_path = os.path.join(folder_path, file_name)

            # 跳过文件夹和日志文件
            if os.path.isdir(file_path) or file_name == os.path.basename(self.log_file):
                continue

            file_ext = os.path.splitext(file_name)[1].lower()

            # 可根据需要添加文件类型
            if file_ext in ['.txt', '.doc', '.docx']:
                sub_folder = 'Text'
            elif file_ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']:
                sub_folder = 'Images'
            elif file_ext in ['.mp4', '.avi', '.mkv']:
                sub_folder = 'Videos'
            elif file_ext in ['.mp3', '.wav']:
                sub_folder = 'Audio'
            elif file_ext in ['.rar', '.zip', '.7z']:
                sub_folder = 'Compressed'
            else:
                sub_folder = 'Others'

            target_folder = os.path.join(folder_path, sub_folder)
            os.makedirs(target_folder, exist_ok=True)

            new_path = os.path.join(target_folder, file_name)
            shutil.move(file_path, new_path)

            move_log.append({"old": file_path, "new": new_path})
            print(f"已移动文件: {file_name} -> {sub_folder}")

        self.update_log(move_log)
        print(f"操作完成,日志已更新到 {self.log_file}")

    # 更新移动日志
    def update_log(self, move_log):
        """追加日志记录"""
        with open(self.log_file, "r+", encoding="utf-8") as f:
            existing_log = json.load(f)
            existing_log.extend(move_log)
            f.seek(0)
            json.dump(existing_log, f, ensure_ascii=False, indent=4)

    # 回滚操作
    def rollback(self):
        """根据日志回滚文件"""
        if not os.path.exists(self.log_file):
            print("没有找到日志文件,无法回滚")
            return

        with open(self.log_file, "r", encoding="utf-8") as f:
            move_log = json.load(f)

        for record in move_log:
            old_path = record["old"]
            new_path = record["new"]

            if os.path.exists(new_path):
                os.makedirs(os.path.dirname(old_path), exist_ok=True)
                shutil.move(new_path, old_path)
                print(f"已回滚文件: {os.path.basename(new_path)} -> 原始位置")

        print("回滚完成")

    def run(self):
        """交互模式"""
        print("请选择操作:")
        print("1. 文件分类")
        print("2. 回滚操作")
        choice = input("输入选项 (1 或 2): ").strip()

        if choice == "1":
            folder_path = input("请输入要分类的文件夹路径: ").strip()
            self.classify_files(folder_path)
        elif choice == "2":
            self.rollback()
        else:
            print("无效选项,请重新运行程序。")


def main():
    organizer = FileOrganizer()
    organizer.run()

if __name__ == "__main__":
    main()
  • 运行代码

  • 选择1或2进行下一步操作

-选择目录路径,进行文件整理

相关推荐
程序员海军4 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee4 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛5 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1146 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
excel6 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰6 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境6 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
w_zero_one7 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan7 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文