假定你正在做一个项目,它的文件保存在C:\AlspythonBook 文件夹中。你担心工作
会丢失,所以希望为整个文件夹创建一个ZIP 文件,作为“快照”。你希望保存不同的版
本,希望 ZIP 文件的文件名每次创建时都有所变化。例如 Al、
Al、Al,等等。你可以手工完成,但这有点烦人,
而且可能不小心弄错ZIP 文件的编号。运行一个程序来完成这个烦人的任务会简单得多。
针对这个项目,打开一个新的文件编辑器窗口,将它保存为 backu。
第 1 步:弄清楚 ZIP 文件的名称
这个程序的代码将放在一个名为 backupToZip()的函数中。这样就更容易将该函
数复制粘贴到其他需要这个功能的 Python 程序中。在这个程序的末尾,会调用这个
函数进行备份。让你的程序看起来像这样:
#! python3
# backu - 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.(folder) # make sure folder is absolute
# Figure out the filename this code should use based on
# what files already exist.
number = 1
while True:
zipFilename = os.(folder) + '_' + str(number) + '.zip'
if not os.(zipFilename):
第 9 章 组织文件 169
break
number = 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 文件的名称就应该是 deliciou,第一次运行该程
序时 N=1,第二次运行时 N=2,以此类推。
通过检查 deliciou 是否存在,然后检查 deliciou 是否存在,继续下
去,可以确定 N 应该是什么。用一个名为 number 的变量表示 N,在一个循环内
不断增加它,并调用 os.()来检查该文件是否存在。第一个不存在的文件
名将导致循环 break,因此它就发现了新 ZIP 文件的文件名。
第 2 步:创建新 ZIP 文件
接下来让我们创建 ZIP 文件。让你的程序看起来像这样:
#! python3
# backu - Copies an entire folder and its contents into
# a ZIP file whose filename increments.
--snip--
while True:
zipFilename = os.(folder) + '_' + str(number) + '.zip'
if not os.(zipFilename):
break
number = number + 1
# Create the ZIP file.
print('Creating %s...' % (zipFilename))
backupZip = zi(zipFilename, 'w')
# TODO: Walk the entire folder tree and compress the files in each folder.
print('Done.')
backupToZip('C:\\delicious')
既然新 ZIP 文件的文件名保存在 zipFilename 变量中,你就可以调用
zi(),实际创建这个 ZIP 文件。确保传入'w'作为第二个参数,这样 ZIP
170 Python 编程快速上手——让繁琐工作自动化
文件以写模式打开。
第 3 步:遍历目录树并添加到 ZIP 文件
现在需要使用 os.walk()函数,列出文件夹以及子文件夹中的每个文件。让你的
程序看起来像这样:
#! python3
# backu - 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.
backu(foldername)
# Add all the files in this folder to the ZIP file.
for filename in filenames:
newBase / os.(folder) + '_'
if (newBase) and ('.zip')
continue # don't backup the backup ZIP files
backu(foldername, filename))
backu()
print('Done.')
backupToZip('C:\\delicious')
可以在 for 循环中使用 os.walk(),在每次迭代中,它将返回这次迭代当前的
文件夹名称、这个文件夹中的子文件夹,以及这个文件夹中的文件名。
在这个 for 循环中,该文件夹被添加到 ZIP 文件。嵌套的 for 循环将遍历
filenames 列表中的每个文件。每个文件都被添加到 ZIP 文件中,以前生成的备份
ZIP 文件除外。
如果运行该程序,它产生的输出看起来像这样:
Creating deliciou...
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 文件,命名为
deliciou,以此类推。