项目:将一个文件夹备份到一个 ZIP 文件

假定你正在做一个项目,它的文件保存在C:\AlsPythonBook 文件夹中。你担心工作会丢失, 所以希望为整个文件夹创建一个ZIP 文件, 作为“快照”。你希望保存不同的版本, 希望ZIP 文件的文件名每次创建时都有所变化。例如AlsPythonBook_1.zip、AlsPythonBook_2.zip、AlsPythonBook_3.zip, 等等。你可以手工完成, 但这有点烦人,而且可能不小心弄错ZIP 文件的编号。运行一个程序来完成这个烦人的任务会简单得多。针对这个项目,打开一个新的文件编辑器窗口, 将它保存为backupToZip.py。

第 1 步:弄清楚 ZIP 文件的名称
这个程序的代码将放在一个名为backupToZip()的函数中。这样就更容易将该函数复制粘贴到其他需要这个功能的Python 程序中。在这个程序的末尾, 会调用这个函数进行备份。让你的程序看起来像这样:

#! python3
# backupToZip.py - Copies an entire folder and its contents into
# a ZIP file whose filename increments.
import zipfile, os
def backupToZip(folder):# Backup the entire contents of "folder" into a ZIP file.folder = os.path.abspath(folder) # make sure folder is absolute# Figure out the filename this code should use based on# what files already exist.number = 1while True:zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'if not os.path.exists(zipFilename):breaknumber = number + 1
# TODO: Create the ZIP file.
# TODO: Walk the entire folder tree and compress the files in each folder.
print('Done.')
backupToZip('C:\\delicious')

先完成基本任务: 添加#!行, 描述该程序做什么,并导入zipfile 和 os 模块。定义backupToZip()函数,它只接收一个参数,即folder。这个参数是一个字符串路径, 指向需要备份的文件夹。该函数将决定它创建的ZIP 文件使用什么文件名,然后创建该文件,遍历folder 文件夹, 将每个子文件夹和文件添加到ZIP 文件中。在源代码中为这些步骤写下TODO 注释, 提醒你稍后来完成。第一部分命名这个ZIP 文件, 使用 folder 的绝对路径的基本名称。如果要备份的文件夹是C:\delicious, ZIP 文件的名称就应该是 delicious_N.zip, 第一次运行该程序时N=1,第二次运行时 N=2, 以此类推。通过检查 delicious_1.zip是否存在, 然后检查 delicious_2.zip是否存在, 继续下去, 可以确定 N应该是什么。 用一个名为 number的变量表示 N, 在一个循环内不断增加它, 并调用os.path.exists()来检查该文件是否存在。 第一个不存在的文件名将导致循环break,因此它就发现了新 ZIP 文件的文件名。

第 2 步:创建新 ZIP 文件
接下来让我们创建 ZIP 文件。让你的程序看起来像这样:

#! python3
# backupToZip.py - Copies an entire folder and its contents into
# a ZIP file whose filename increments.
--snip--while True:zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'if not os.path.exists(zipFilename):breaknumber = number + 1
# Create the ZIP file.
print('Creating %s...' % (zipFilename))
backupZip = zipfile.ZipFile(zipFilename, 'w')
# TODO: Walk the entire folder tree and compress the files in each folder.
print('Done.')
backupToZip('C:\\delicious')

既然新 ZIP 文件的文件名保存在 zipFilename 变量中, 你就可以调用 zipfile.ZipFile() ,实际创建这个 ZIP 文件 。确保传入 'w' 作为第二个参数, 这样 ZIP文件以写模式打开。

第 3 步:遍历目录树并添加到 ZIP 文件
现在需要使用 os.walk() 函数,列出文件夹以及子文件夹中的每个文件。让你的程序看起来像这样:

#! python3
# backupToZip.py - Copies an entire folder and its contents into
# a ZIP file whose filename increments.
--snip--
# Walk the entire folder tree and compress the files in each folder.for foldername, subfolders, filenames in os.walk(folder):
print('Adding files in %s...' % (foldername))
# Add the current folder to the ZIP file.backupZip.write(foldername)
# Add all the files in this folder to the ZIP file.for filename in filenames:newBase = os.path.basename(folder) + '_'if filename.startswith(newBase) and filename.endswith('.zip')continue # don't backup the backup ZIP filesbackupZip.write(os.path.join(foldername, filename))backupZip.close()print('Done.')
backupToZip('C:\\delicious')

可以在 for 循环中使用 os.walk() ,在每次迭代中,它将返回这次迭代当前的文件夹名称、 这个文件夹中的子文件夹,以及这个文件夹中的文件名。在这个 for 循环中,该文件夹被添加到 ZIP 文件 。嵌套的 for 循环将遍 filenames 列表中的每个文件 。每个文件都被添加到 ZIP 文件中, 以前生成的备份 ZIP 文件除外。如果运行该程序,它产生的输出看起来像这样:

Creating delicious_1.zip...
Adding files in C:\delicious...
Adding files in C:\delicious\cats...
Adding files in C:\delicious\waffles...
Adding files in C:\delicious\walnut...
Adding files in C:\delicious\walnut\waffles...
Done.

第二次运行它时,它将 C:\delicious 中的所有文件放进一个 ZIP 文件, 命名为 delicious_2.zip , 以此类推。

第 4 步:类似程序的想法
你可以在其他程序中遍历一个目录树, 将文件添加到压缩的ZIP 归档文件中。
例如,你可以编程做下面的事情:
• 遍历一个目录树, 将特定扩展名的文件归档, 诸如.txt或.py,并排除其他文件。
• 遍历一个目录树,将除.txt和.py 文件以外的其他文件归档。
• 在一个目录树中查找文件夹,它包含的文件数最多,或者使用的磁盘空间最大。

完整程序:

#-*-coding:utf-8-*-#! python3
# backupToZip - Copies an entire folder and its contents into
# a ZIP file whose filename incrementsimport zipfile,osdef backupToZip(folder):# Backup the entire contents of "folder" into a ZIP file.folder = os.path.abspath(folder)   #make sure folder is absolute# Figure out the filename this code should use based on what# files already exist.number = 1while True:zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'if not os.path.exists(zipFilename):breaknumber += 1# Create the ZIP file.print('Creating %s...'%(zipFilename))backupZip = zipfile.ZipFile(zipFilename,'w')# walk the entire folder tree and compress the files in each folder.for foldername,subfolders,filenames in os.walk(folder):print('Adding files in %s...'%(foldername))# Add the current folder to the ZIP file.backupZip.write(foldername)for filename in filenames:newBase = os.path.basename(folder) + '_'if filename.startswith(newBase) and filename.endswith('.zip'):continuebackupZip.write(os.path.join(foldername,filename))backupZip.close()print('Done.')backupToZip('C:\\delicious')

python实践项目(九)相关推荐

  1. python实践项目-shop

    python实践项目-shop 练习 文件打开/保存 cmd应用 prettytable 场景 使用CMD程序,实现商店管理 python3+pycharm 源码 getPicke.py 初始化PIC ...

  2. Python实践项目——LSB隐写术

    一.项目背景 1.隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容. 2.LSB 隐写术 LSB 隐写术是一种图像隐写术技 ...

  3. python实践项目(七)

    项目1:生成随机的测验试卷文件 假如你是一位地理老师,班上有35 名学生, 你希望进行美国各州首府的一个小测验.不妙的是,班里有几个坏蛋,你无法确信学生不会作弊.你希望随机调整问题的次序, 这样每份试 ...

  4. python实践项目(八)

    项目:将带有美国风格日期的文件改名为欧洲风格日期 假定你的老板用电子邮件发给你上千个文件,文件名包含美国风格的日期(MM-DD-YYYY),需要将它们改名为欧洲风格的日期(DD-MM-YYYY).手工 ...

  5. python实践项目(五)

    参考书目:<Python编程快速上手-让繁琐工作自动化>,下载地址:我是下载链接,请点击 练习1:口令保管箱 你可能在许多不同网站上拥有账号,每个账号使用相同的口令是个坏习惯.如果这些网站 ...

  6. python实践项目(四)

    练习1:好玩游戏的物品清单 你在创建一个好玩的视频游戏.用于对玩家物品清单建模的数据结构是一个字典.其中键是字符串,描述清单中的物品,值是一个整型值,说明玩家有多少该物品.例如,字典值{'rope': ...

  7. python实践项目(一)

    Collatz 序列:        要求1:编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并 ...

  8. python实践项目(十一)

    1.从图像网站下载 编写一个程序,访问图像共享网站,如 Flickr 或 Imgur,查找一个类型的照片,然后下载所有查询结果的图像.可以编写一个程序,访问任何具有查找功能的图像网站. #-*-cod ...

  9. python实践项目(十)

    调试硬币抛掷 下面程序的意图是一个简单的硬币抛掷猜测游戏.玩家有两次猜测机会(这是一个简单的游戏).但是,程序中有一些缺陷.让程序运行几次,找出缺陷,使该程序能正确运行. import random ...

最新文章

  1. 理解数据类型与数学运算:求和、温度转换
  2. java 两个数交换问题
  3. yii2 获取同一个账号登录的所有session_前端登录方案?这一篇就够了
  4. vscode配置浏览器
  5. 2.5 Hive中外部表的讲解
  6. c语言软件电脑下载文件,求C语言头文件下载?
  7. 前天做了一个点击随机改变背景色的JS,请各位老师指导下:
  8. NVMe驱动学习记录-1
  9. python统计微信群接龙并实时反馈
  10. 商城前端模板_新零售时代如何玩转微信商城
  11. 【非同局域网】vue调取本地后台服务解决方法
  12. linux bigendian未定义,big endian与little endian
  13. 盘点世界上千奇百怪的数据中心选址,这些地方你一定想不到!
  14. 乱记春秋-或跃在渊 (苏阳飘零记)
  15. C语言常见文件操作函数总结详解
  16. Windows10修改本地用户账户名(彻底修改)
  17. android mac 照片恢复,照片恢复
  18. 利用matlab快速实现连续系统转变为离散系统(z变换)
  19. mysql 唯一键_MySQL数据库8(十)唯一键
  20. 快消品行业ERP系统仓储模块应该包括哪些功能?

热门文章

  1. 微博热榜排行榜zset
  2. 5-2 持久化的作用/5-3 RDB1/5-4 RDB2/5-5 RDB3
  3. fileTOFILE
  4. Python爬虫学习框架介绍
  5. 源代码 oa办公系统jsp_【程序源代码】经典的办公系统开发框架
  6. mysql连接自己的ip地址_mysql 连接字符串 远程连接用IP地址 而非只是localhost时
  7. linux命令grep和find怎么用,Linux下find和grep常用命令及区别介绍
  8. 中livechart显示大数据_大数据显示:辽宁新基建技能人才存量居全国第十位
  9. Python+OpenCV:二维直方图(2D Histograms)
  10. VC编程操作Word2010生成表格