Python 备份文件夹结构

本贴最后更新于 1563 天前,其中的信息可能已经事过景迁
import sys import os import pathlib import shutil import filecmp import fnmatch import tqdm from pprint import pprint r''' 作者:HaujetZhao 日期:2021 年 1 月 24 日 脚本功能: 将 “源目录” 的文件夹、文件结构复制到 “目标文件夹”,小于指定大小的文件复制过去,大于指定大小的文件,就不复制了,而是在目标文件夹中新建一个同名的空白文件。 解决的问题: 硬盘上有许多珍贵的资料,是辛苦收集来的,它们有这些特征: * 它们不是太珍贵,因为在网上花一些力气可以找到 * 它们也珍贵,因为的确有用 * 某些时候可能需要其中一些文件 * 其中有一些文件体积特别大,多处备份会很费空间、成本 * 丢掉这些文件可能会有些 trouble * 一旦丢失,因为不记得都有哪些文件,即使网上有资源,也很难一下子收集起来 比如: * 一些电影、记录片(动辄好几十 GB) * 为了防止和谐、方便观看而缓存的一些油管、B站的优秀视频(动辄好几百 MB) * 一些百科文件(动辄好几十 GB) 它们不值得花大精力进行冗余备份,但是一旦丢掉也挺可惜。 所以,我就需要将这些文件夹、文件名的结构备份下来,备份占用的体积小,同时,在源文件丢失后,我可以清楚地知道有哪些文件丢了,再去网上下一份。 另外,还加了一个筛选功能,比如,小于 1000kB 的文件就备份上,这些文件一般是文本文件,里面的信息一般比较重要。 比如,可以在一个文本文件中中记录下,某些视频是从哪里下载来的,链接是什么,UP 主是谁。这样,文件丢失后,还可以方便地再下载一份,如果和谐了,也知道是谁的什么作品,可以去找作者联系。 用法: 在下方设定参数,再运行此 python 脚本 ''' # ============================================================== # 在这里设定参数 源根目录 = r'E:/' 目标根目录 = r'F:/仓库盘备份' 复制文件体积阈值 = 1000 # 单位是 kB,大于这个大小的文件不会被复制,而是会创建一个同名的空白文件 文件名匹配规则 = r'*' # ============================================================== def 检查路径(路径): if not os.path.exists(路径): try: os.makedirs(路径) return True except: return False else: return True def 遍历得全部文件夹(父文件夹): 子文件夹列表 = [] print(f'\n正在获取所有子文件夹:{父文件夹}') for root, dirs, files in os.walk(父文件夹): 子文件夹列表.append(root) return 子文件夹列表 def 遍历得全部文件(父文件夹): 子文件列表 = [] print(f'\n正在获取所有子文件:{父文件夹}') for root, dirs, files in os.walk(父文件夹): if len(files) == 0: next for file_ in files: 子文件列表.append(os.path.join(root, file_)) return 子文件列表 def 源列表转目标列表(源路径列表, 源根目录, 目标根目录): 路径列表 = [] for 源路径 in 源路径列表: 目标路径 = str(pathlib.Path(目标根目录) / pathlib.Path(源路径).relative_to(源根目录)) 路径列表.append(目标路径) return 路径列表 def 清理废弃路径(实际路径列表, 目标路径列表): # 实际路径列表 表示 目前有哪些文件 # 目标路径列表 表示 清理后要留下哪些文件 要清理的路径集合 = set(实际路径列表) - set(目标路径列表) for 清理目标 in 要清理的路径集合: try: if os.path.isdir(清理目标): shutil.rmtree(清理目标) elif os.path.isfile(清理目标): os.remove(清理目标) except Exception as e: print(f'一个文件清理失败\n 路径:{清理目标}\n 原因:{e}') def 得到路径Pair列表(源路径列表, 源根目录, 目标根目录): 路径Pair列表 = [] for 源路径 in 源路径列表: 目标路径 = str(pathlib.Path(目标根目录) / pathlib.Path(源路径).relative_to(源根目录)) 路径Pair列表.append([源路径, 目标路径]) return 路径Pair列表 def main(): print('\n开始备份\n') global 源根目录, 目标根目录, 复制文件体积阈值, 文件名匹配规则 if len(sys.argv) > 1: 源根目录 = sys.argv[1] 目标根目录 = sys.argv[2] if not 检查路径(源根目录): print(f'源目录不存在') if not 检查路径(目标根目录): print(f'目标目录不存在') # 得到源目录实际的文件夹、文件 源目录列表 = 遍历得全部文件夹(源根目录) 源文件列表 = 遍历得全部文件(源根目录) # 将源目录实际的文件夹、文件转为目标路径 目标目录列表 = 源列表转目标列表(源目录列表, 源根目录, 目标根目录) 目标文件列表 = 源列表转目标列表(源文件列表, 源根目录, 目标根目录) # 得到目标中实际的文件和文件夹 目标实际目录列表 = 遍历得全部文件夹(目标根目录) 目标实际文件列表 = 遍历得全部文件(目标根目录) 清理废弃路径(目标实际目录列表, 目标目录列表) 清理废弃路径(目标实际文件列表, 目标文件列表) 目录Pair列表 = 得到路径Pair列表(源目录列表, 源根目录, 目标根目录) 文件Pair列表 = 得到路径Pair列表(源文件列表, 源根目录, 目标根目录) # pprint(目录Pair列表) # 复制文件夹结构 print(f'\n开始备份文件夹结构') for 目录Pair in tqdm.tqdm(目录Pair列表): 检查路径(目录Pair[1]) # 复制文件结构 print(f'\n开始备份文件') for 文件Pair in tqdm.tqdm(文件Pair列表): 源文件kB大小 = os.path.getsize(文件Pair[0]) / 1024 if 源文件kB大小 <= 复制文件体积阈值 and fnmatch.fnmatch(文件Pair[0], 文件名匹配规则): try: if os.path.exists(文件Pair[1]): if filecmp.cmp(文件Pair[0], 文件Pair[1]): next shutil.copy(文件Pair[0], 文件Pair[1]) except Exception as e: print(f'一个文件复制失败\n 源路径:{文件Pair[0]}\n 目标路径:{文件Pair[1]}\n 原因:{e}') else: if os.path.exists(文件Pair[1]): pass else: try: f = open(文件Pair[1], 'wb') f.close except Exception as e: print(f'一个空白文件创建失败\n 源路径:{文件Pair[0]}\n 目标路径:{文件Pair[1]}\n 原因:{e}') print(f'\n完成\n') if __name__ == '__main__': main()
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
2 操作
HaujetZhao 在 2021-01-24 11:50:52 更新了该帖
HaujetZhao 在 2021-01-24 11:41:34 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 118 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 111 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 191 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 105 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    432 引用 • 1250 回帖 • 596 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 565 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 446 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 2 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 2 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖 • 1 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    174 引用 • 3851 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    95 引用 • 901 回帖 • 1 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖 • 1 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    588 引用 • 3538 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 496 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 导航

    各种网址链接、内容导航。

    44 引用 • 177 回帖