Python 备份文件夹结构

本贴最后更新于 1520 天前,其中的信息可能已经事过景迁
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 引用 • 674 回帖
2 操作
HaujetZhao 在 2021-01-24 11:50:52 更新了该帖
HaujetZhao 在 2021-01-24 11:41:34 更新了该帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 459 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 235 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 382 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 28 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 319 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 617 关注
  • Excel
    31 引用 • 28 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 700 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 592 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 207 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 45 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 735 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 541 回帖
  • 旅游

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

    93 引用 • 901 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    21 引用 • 204 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 76 回帖 • 2 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • OpenCV
    15 引用 • 36 回帖