← 返回 Day 61 正文

Day 61 · 练习与清单

Day 061 — 文件与路径操作 · 完成清单

✅ 学习检查表


📝 基础练习题

练习 1:目录统计工具

编写一个函数,用 pathlib 统计指定目录: - 文件总数和目录总数 - 总大小(人类可读格式,如 "1.2 GB") - 按后缀分组的文件数量 - 最大的 5 个文件 - 最旧的 5 个文件

练习 2:批量文件重命名

编写脚本,实现以下重命名模式: - 将所有空格替换为下划线 - 将文件名转为小写 - 按序号重命名:photo_001.jpg, photo_002.jpg, ... - 支持 dry-run 预览模式

练习 3:文件搜索器

实现一个文件搜索引擎,支持: - 按后缀搜索 - 按大小范围搜索 - 按修改时间搜索 - 按文件名模式搜索(支持通配符) - 输出结果为 JSON


🚀 进阶挑战题

挑战 1:智能备份工具

实现增量备份工具: - 只备份有变化的文件 - 支持保留历史版本(按日期) - 生成备份报告 - 支持恢复指定版本

挑战 2:重复文件检测

实现重复文件检测器: - 用文件大小做初步筛选 - 用 MD5 哈希做精确比对 - 输出重复文件组 - 支持选择保留策略(最新/最旧/手动)

挑战 3:文件整理助手

实现自动文件整理工具: - 按文件类型分类到对应目录 - 按日期创建子目录 - 处理文件名冲突 - 生成整理日志


💡 思考题答案提示

  1. 100 万文件统计:用 Path.rglob("*.log") 配合生成器逐个处理,避免一次性加载所有文件到内存。os.walk 也可以,但 pathlib 的 API 更清晰。

  2. 清理工具设计:用 Path.rglob("*.log") 查找日志,检查 stat().st_mtime 判断时间,shutil.copy2 + shutil.make_archive 压缩,Path.unlink 删除。

  3. copy vs copy2:copy 只复制内容和权限,copy2 还复制元数据(时间戳等)。备份场景必须用 copy2,否则无法判断文件是否更新。

  4. 安全删除函数:先 p.exists() 检查,p.is_symlink() 跳过符号链接,检查 p.resolve() 是否在白名单目录内,最后 p.unlink()。

  5. os.listdir vs Path.iterdir:os.listdir 返回字符串列表,内存开销小;Path.iterdir 返回 Path 对象,功能更丰富但有对象创建开销。处理大量文件时 os.listdir 略快。