import osimport shutilimport hashlibfrom datetime import datetimeimport jsonclass 智能文件管理器: def __init__(self): self.工作目录 = os.getcwd self.配置文件 = "文件管理器设置.json" self.初始化设置 def 初始化设置(self): """初始化文件管理器设置""" 默认设置 = { "文件分类": { "图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg"], "文档": [".pdf", ".doc", ".docx", ".txt", ".md", ".rtf"], "代码": [".py", ".java", ".cpp", ".c", ".js", ".html", ".css"], "音频": [".mp3", ".wav", ".flac", ".aac"], "视频": [".mp4", ".avi", ".mkv", ".mov"], "压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"] }, "忽略文件夹": [".git", "__pycache__", "node_modules", ".idea"], "备份文件夹": "文件备份" } if not os.path.exists(self.配置文件): with open(self.配置文件, 'w', encoding='utf-8') as f: json.dump(默认设置, f, ensure_ascii=False, indent=2) print("✅ 配置文件初始化完成!") def 读取设置(self): """读取配置文件""" with open(self.配置文件, 'r', encoding='utf-8') as f: return json.load(f) def 显示菜单(self): """显示主菜单""" print("\n" + "=" * 50) print(" 智能文件管理器") print("=" * 50) print("1. 显示当前目录文件") print("2. 文件分类整理") print("3. 批量重命名") print("4. 查找重复文件") print("5. 搜索文件") print("6. 文件统计") print("7. 备份重要文件") print("8. 更改工作目录") print("9. 退出") print("=" * 50) def 显示当前目录文件(self): """显示当前目录的文件和文件夹""" print(f"\n 当前目录: {self.工作目录}") print("-" * 60) try: 文件列表 = os.listdir(self.工作目录) except PermissionError: print("❌ 没有权限访问该目录") return # 分离文件和文件夹 文件夹列表 = 文件列表 = for 项目 in sorted(os.listdir(self.工作目录)): 完整路径 = os.path.join(self.工作目录, 项目) if os.path.isdir(完整路径): 文件夹列表.append(项目) else: 文件列表.append(项目) print(" 文件夹:") for 文件夹 in 文件夹列表: 完整路径 = os.path.join(self.工作目录, 文件夹) 文件数 = len([f for f in os.listdir(完整路径) if os.path.isfile(os.path.join(完整路径, f))]) print(f" {文件夹}/ ({文件数}个文件)") print("\n 文件:") for 文件 in 文件列表: 完整路径 = os.path.join(self.工作目录, 文件) 大小 = os.path.getsize(完整路径) 修改时间 = datetime.fromtimestamp(os.path.getmtime(完整路径)) print(f" {文件} ({self.格式化文件大小(大小)}) - {修改时间.strftime('%Y-%m-%d %H:%M')}") def 格式化文件大小(self, 字节数): """格式化文件大小显示""" for 单位 in ['B', 'KB', 'MB', 'GB']: if 字节数 {目标分类}/") 移动统计 += 1 except Exception as e: print(f"❌ 移动失败 {文件名}: {e}") print(f"✅ 文件整理完成!共移动 {移动统计} 个文件") def 批量重命名(self): """批量重命名文件""" print("\n✏️ 批量重命名") print("-" * 30) # 选择文件类型 文件类型 = input("要重命名的文件类型 (如 .txt, 留空为所有文件): ") 前缀 = input("新文件名前缀: ") 起始编号 = int(input("起始编号: ")) 重命名统计 = 0 for 文件名 in os.listdir(self.工作目录): 完整路径 = os.path.join(self.工作目录, 文件名) if os.path.isfile(完整路径): # 检查文件类型 _, 扩展名 = os.path.splitext(文件名) if 文件类型 and 扩展名.lower != 文件类型.lower: continue # 生成新文件名 新文件名 = f"{前缀}_{起始编号:03d}{扩展名}" 新路径 = os.path.join(self.工作目录, 新文件名) try: os.rename(完整路径, 新路径) print(f" 重命名: {文件名} -> {新文件名}") 重命名统计 += 1 起始编号 += 1 except Exception as e: print(f"❌ 重命名失败 {文件名}: {e}") print(f"✅ 重命名完成!共处理 {重命名统计} 个文件") def 计算文件哈希(self, 文件路径): """计算文件的MD5哈希值""" hash_md5 = hashlib.md5 try: with open(文件路径, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash_md5.update(chunk) return hash_md5.hexdigest except Exception as e: print(f"❌ 无法读取文件 {文件路径}: {e}") return None def 查找重复文件(self): """查找重复文件""" print("\n 正在查找重复文件...") 文件哈希表 = {} 重复文件 = for 根目录, 文件夹列表, 文件列表 in os.walk(self.工作目录): # 跳过忽略的文件夹 设置 = self.读取设置 for 忽略文件夹 in 设置["忽略文件夹"]: if 忽略文件夹 in 文件夹列表: 文件夹列表.remove(忽略文件夹) for 文件名 in 文件列表: 文件路径 = os.path.join(根目录, 文件名) # 计算文件哈希 文件哈希 = self.计算文件哈希(文件路径) if 文件哈希 is None: continue # 检查是否重复 if 文件哈希 in 文件哈希表: 重复文件.append((文件路径, 文件哈希表[文件哈希])) else: 文件哈希表[文件哈希] = 文件路径 if 重复文件: print(f"\n⚠️ 找到 {len(重复文件)} 组重复文件:") print("=" * 60) for i, (文件1, 文件2) in enumerate(重复文件, 1): print(f"第{i}组重复文件:") print(f" A: {文件1}") print(f" B: {文件2}") print(f" 大小: {self.格式化文件大小(os.path.getsize(文件1))}") print("-" * 40) # 提供删除选项 选择 = input("\n是否删除重复文件?(y/N): ") if 选择.lower == 'y': self.删除重复文件(重复文件) else: print("✅ 没有找到重复文件!") def 删除重复文件(self, 重复文件): """删除重复文件""" 删除统计 = 0 for 文件1, 文件2 in 重复文件: # 保留修改时间较新的文件 时间1 = os.path.getmtime(文件1) 时间2 = os.path.getmtime(文件2) if 时间1 >= 时间2: 删除文件 = 文件2 else: 删除文件 = 文件1 try: os.remove(删除文件) print(f"️ 删除: {删除文件}") 删除统计 += 1 except Exception as e: print(f"❌ 删除失败 {删除文件}: {e}") print(f"✅ 删除完成!共删除 {删除统计} 个重复文件") def 搜索文件(self): """搜索文件""" print("\n 文件搜索") print("-" * 30) 关键词 = input("搜索关键词: ") 搜索类型 = input("搜索类型 (1-文件名, 2-内容, 3-两者): ") or "1" 结果 = for 根目录, 文件夹列表, 文件列表 in os.walk(self.工作目录): # 跳过忽略的文件夹 设置 = self.读取设置 for 忽略文件夹 in 设置["忽略文件夹"]: if 忽略文件夹 in 文件夹列表: 文件夹列表.remove(忽略文件夹) for 文件名 in 文件列表: 文件路径 = os.path.join(根目录, 文件名) 相对路径 = os.path.relpath(文件路径, self.工作目录) # 文件名搜索 if 搜索类型 in ["1", "3"] and 关键词.lower in 文件名.lower: 结果.append(相对路径) continue # 文件内容搜索 if 搜索类型 in ["2", "3"]: try: with open(文件路径, 'r', encoding='utf-8', errors='ignore') as f: 内容 = f.read if 关键词.lower in 内容.lower: 结果.append(相对路径) except: # 跳过二进制文件 pass if 结果: print(f"\n✅ 找到 {len(结果)} 个结果:") print("=" * 50) for 文件路径 in 结果: print(f" {文件路径}") else: print("❌ 没有找到匹配的文件") def 文件统计(self): """统计文件信息""" print("\n 正在统计文件信息...") 统计信息 = { "总文件数": 0, "总大小": 0, "按类型统计": {}, "按大小统计": {"小文件(10MB)": 0}, "按时间统计": {"今天": 0, "本周": 0, "本月": 0, "更早": 0} } 今天 = datetime.now for 根目录, 文件夹列表, 文件列表 in os.walk(self.工作目录): # 跳过忽略的文件夹 设置 = self.读取设置 for 忽略文件夹 in 设置["忽略文件夹"]: if 忽略文件夹 in 文件夹列表: 文件夹列表.remove(忽略文件夹) for 文件名 in 文件列表: 文件路径 = os.path.join(根目录, 文件名) try: # 文件大小 大小 = os.path.getsize(文件路径) 统计信息["总文件数"] += 1 统计信息["总大小"] += 大小 # 按类型统计 _, 扩展名 = os.path.splitext(文件名) 扩展名 = 扩展名.lower if 扩展名 else "无扩展名" 统计信息["按类型统计"][扩展名] = 统计信息["按类型统计"].get(扩展名, 0) + 1 # 按大小统计 if 大小 10MB 统计信息["按大小统计"]["大文件(>10MB)"] += 1 # 按时间统计 修改时间 = datetime.fromtimestamp(os.path.getmtime(文件路径)) 时间差 = 今天 - 修改时间 if 时间差.days == 0: 统计信息["按时间统计"]["今天"] += 1 elif 时间差.days import jsonimport osfrom datetime import datetime, timedeltaimport csvclass 学习进度跟踪系统: def __init__(self): self.数据文件 = "学习数据.json" self.初始化数据 def 初始化数据(self): """初始化学习数据""" if not os.path.exists(self.数据文件): 初始数据 = { "学习科目": {}, "学习记录": , "学习目标": {}, "统计信息": { "总学习时间": 0, "平均每日学习": 0, "最常学习科目": "", "连续学习天数": 0 } } self.保存数据(初始数据) print("✅ 学习跟踪系统初始化完成!") def 读取数据(self): """读取学习数据""" with open(self.数据文件, 'r', encoding='utf-8') as f: return json.load(f) def 保存数据(self, 数据): """保存学习数据""" with open(self.数据文件, 'w', encoding='utf-8') as f: json.dump(数据, f, ensure_ascii=False, indent=2) def 添加学习科目(self): """添加新的学习科目""" print("\n 添加学习科目") print("-" * 30) 科目名称 = input("科目名称: ") 描述 = input("科目描述: ") 目标时长 = int(input("目标学习时长(小时): ")) 数据 = self.读取数据 if 科目名称 in 数据["学习科目"]: print("❌ 该科目已存在!") return 数据["学习科目"][科目名称] = { "描述": 描述, "目标时长": 目标时长, "已学时长": 0, "创建时间": datetime.now.isoformat } self.保存数据 print(f"✅ 科目 '{科目名称}' 添加成功!") def 记录学习进度(self): """记录学习进度""" 数据 = self.读取数据 if not 数据["学习科目"]: print("❌ 请先添加学习科目!") return print("\n 记录学习进度") print("-" * 30) # 显示科目列表 print("可选科目:") for i, 科目 in enumerate(数据["学习科目"].keys, 1): print(f" {i}. {科目}") 科目选择 = input("选择科目 (编号或名称): ") # 根据编号或名称获取科目 if 科目选择.isdigit: 科目列表 = list(数据["学习科目"].keys) if 0 0 else 0 # 最常学习科目 科目统计 = {} for 记录 in 数据["学习记录"]: 科目统计[记录["科目"]] = 科目统计.get(记录["科目"], 0) + 记录["时长"] if 科目统计: 最常科目 = max(科目统计.items, key=lambda x: x[1]) 数据["统计信息"]["最常学习科目"] = 最常科目[0] # 连续学习天数 数据["统计信息"]["连续学习天数"] = self.计算连续学习天数 def 计算连续学习天数(self, 数据): """计算连续学习天数""" 日期列表 = for 记录 in 数据["学习记录"]: 日期 = datetime.fromisoformat(记录["日期"]).date if 日期 not in 日期列表: 日期列表.append(日期) 日期列表.sort 连续天数 = 0 当前日期 = datetime.now.date while 当前日期 in 日期列表: 连续天数 += 1 当前日期 -= timedelta(days=1) return 连续天数 def 查看学习记录(self): """查看学习记录""" 数据 = self.读取数据 if not 数据["学习记录"]: print("还没有学习记录!") return print(f"\n 学习记录 (共{len(数据['学习记录'])}条)") print("=" * 80) print(f"{'ID': 0 else 0 if 进度Percentage >= 100: 状态 = "✅ 完成" elif 进度百分比 >= 75: 状态 = " 接近完成" elif 进度百分比 >= 50: 状态 = "⏳ 进行中" else: 状态 = " 刚开始" print(f"{科目名称:= 本周开始: 本周学习 += 记录["时长"] return 本周学习 def 获取最近学习趋势(self, 数据, 天数=7): """获取最近学习趋势""" 趋势 = 今天 = datetime.now.date for i in range(天数-1, -1, -1): 日期 = 今天 - timedelta(days=i) 日期字符串 = 日期.strftime("%m月%d日") 当日学习 = 0 for 记录 in 数据["学习记录"]: 记录日期 = datetime.fromisoformat(记录["日期"]).date if 记录日期 == 日期: 当日学习 += 记录["时长"] 趋势.append((日期字符串, 当日学习)) return 趋势 def 设置学习目标(self): """设置学习目标""" print("\n 设置学习目标") print("-" * 30) 目标类型 = input("目标类型 (1-每日目标, 2-每周目标, 3-每月目标): ") 目标时长 = float(input("目标学习时长(小时): ")) 数据 = self.读取数据 目标类型映射 = {"1": "每日", "2": "每周", "3": "每月"} 类型名称 = 目标类型映射.get(目标类型, "每日") 数据["学习目标"][类型名称] = { "时长": 目标时长, "设置时间": datetime.now.isoformat } self.保存数据 print(f"✅ {类型名称}目标设置为: {目标时长} 小时") def 导出学习数据(self): """导出学习数据为CSV""" 数据 = self.读取数据 if not 数据["学习记录"]: print("没有学习数据可导出!") return csv文件名 = f"学习数据_导出_{datetime.now.strftime('%Y%m%d_%H%M%S')}.csv" with open(csv文件名, 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['ID', '日期', '科目', '学习时长', '学习内容', '难度等级']) # 写入数据 for 记录 in 数据["学习记录"]: 日期 = datetime.fromisoformat(记录["日期"]).strftime("%Y-%m-%d") writer.writerow([ 记录['id'], 日期, 记录['科目'], 记录['时长'], 记录['内容'], 记录['难度'] ]) print(f"✅ 学习数据已导出到: {csv文件名}") def 显示菜单(self): """显示主菜单""" print("\n" + "=" * 50) print(" 学习进度跟踪系统") print("=" * 50) print("1. 添加学习科目") print("2. 记录学习进度") print("3. 查看学习记录") print("4. 科目进度统计") print("5. 生成学习报告") print("6. 设置学习目标") print("7. 导出学习数据") print("8. 退出系统") print("=" * 50) def 运行(self): """运行学习跟踪系统""" print(" 欢迎使用学习进度跟踪系统!") while True: self.显示菜单 选择 = input("请选择操作 (1-8): ") if 选择 == '1': self.添加学习科目 elif 选择 == '2': self.记录学习进度 elif 选择 == '3': self.查看学习记录 elif 选择 == '4': self.科目进度统计 elif 选择 == '5': self.生成学习报告 elif 选择 == '6': self.设置学习目标 elif 选择 == '7': self.导出学习数据 elif 选择 == '8': print("感谢使用!继续加油学习!") break else: print("❌ 无效选择,请重新输入!")# 运行学习跟踪系统if __name__ == "__main__": 学习系统 = 学习进度跟踪系统 学习系统.运行学习数据库:用SQLite替代文件存储创建图形界面:使用tkinter、PyQt或Web框架添加网络功能:数据同步到云端性能优化:处理大量数据时的性能考虑打包发布:将应用打包为可执行文件摘要:import osimport shutilimport hashlibfrom datetime import datetimeimport jsonclass 智能文件管理器: def __init__(self): self.工作目录 = os.getc
恭喜你完成了Python文件操作的完整学习旅程! 现在你已经有能力创建各种实用的文件处理应用程序了!
来源:琢磨先生起飞吧
