如果上面的程序不能够正常工作,复制打印在 Zip command is 后面的命令,将其粘贴至 shell(在 GNU/Linux 与 Mac OS X 环境中)或 cmd(对于 Windows 环境),看看存在什么错误并尝试将其修复。同时你还需要检查 zip 命令手册来看看是不是哪里存在错误。如果这条命令成功运行,那么可能是错误可能存在在 Python 程序本身之中,因此你需要检查你的程序是否如上面所展示那番。
它是如何工作的
你会注意到我们是如何一步步将我们的设计转化为代码的。
我们首先导入 os 与 time 模块以准备使用它们。然后,我们在 source 列表中指定我们需要备份的文件与目录。我们需要存储我们所有备份文件的目标目录在 target_dir 变量中予以指定。我们将要创建的 zip 归档文件的名字由当前日期与时间构成,在这里通过 time.strftime() 函数来创建。文件名将以 .zip 作为扩展名,并存储在 target_dir 目录中。
在这里要注意 os.sep 变量的使用方式——它将根据你的操作系统给出相应的分隔符,在 GNU/Linux 与 Unix 中它会是 '/',在 Windows 中它会是 '\\',在 Mac OS 中它会是 ':'。使用 os.sep 而非直接使用这些字符有助于使我们的程序变得可移植,从而可以在上述这些系统中都能正常工作。
我们使用_连接(Concatenates)_字符串的加法(+)运算符来创建目标 zip 文件的文件名,也就是说,它将两个字符串连接到一起并返回一个新的字符串。然后,我们创建了一串字符串 zip_command,其中包括了我们要执行的命令。如果这条命令不能正常工作,你可以把它拷贝到 Shell(GNU/Linux 终端或 DOS 提示符)中进行检查。
我们使用的 zip 命令会有一些选项与参数需要传递。-r 选项用以指定 zip 命令应该递归地(Recursively)对目录进行工作,也就是说它应该包括所有的子文件夹与其中的文件。这两个选项结合到一起并可以指定一个快捷方式作 -qr。选项后面跟着的是将要创建的 zip 文件的名称,再往后是需要备份的文件与目录的列表。我们通过使用已经讨论过并已了解该如何运用的的字符串方法 join 来将列表 source 转换成字符串。
import os
import time
# 1. 需要备份的文件与目录将被
# 指定在一个列表中。
# 例如在 Windows 下:
# source = ['"C:\\My Documents"', 'C:\\Code']
# 又例如在 Mac OS X 与 Linux 下:
source = ['/Users/swa/notes']
# 在这里要注意到我们必须在字符串中使用双引号
# 用以括起其中包含空格的名称。
# 2. 备份文件必须存储在一个
# 主备份目录中
# 例如在 Windows 下:
# target_dir = 'E:\\Backup'
# 又例如在 Mac OS X 和 Linux 下:
target_dir = '/Users/swa/backup'
# 要记得将这里的目录地址修改至你将使用的路径
# 如果目标目录还不存在,则进行创建
if not os.path.exists(target_dir):
os.mkdir(target_dir) # 创建目录
# 3. 备份文件将打包压缩成 zip 文件。
# 4. 将当前日期作为主备份目录下的
# 子目录名称
today = target_dir + os.sep + time.strftime('%Y%m%d')
# 将当前时间作为 zip 文件的文件名
now = time.strftime('%H%M%S')
# 添加一条来自用户的注释以创建
# zip 文件的文件名
comment = input('Enter a comment --> ')
# 检查是否有评论键入
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + '_' + \
comment.replace(' ', '_') + '.zip'
# 如果子目录尚不存在则创建一个
if not os.path.exists(today):
os.mkdir(today)
print('Successfully created directory', today)
# 5. 我们使用 zip 命令将文件打包成 zip 格式
zip_command = 'zip -r {0} {1}'.format(target,
' '.join(source))
# 运行备份
print('Zip command is:')
print(zip_command)
print('Running:')
if os.system(zip_command) == 0:
print('Successful backup to', target)
else:
print('Backup FAILED')
输出:
$ python backup_ver4.py
Enter a comment --> added new examples
Zip command is:
zip -r /Users/swa/backup/20140329/074122_added_new_examples.zip /Users/swa/notes
Running:
adding: Users/swa/notes/ (stored 0%)
adding: Users/swa/notes/blah1.txt (stored 0%)
adding: Users/swa/notes/blah2.txt (stored 0%)
adding: Users/swa/notes/blah3.txt (stored 0%)
Successful backup to /Users/swa/backup/20140329/074122_added_new_examples.zip
它是如何工作的
现在程序可以正常工作了!让我们来回顾一下我们在第三版中所作出的实际的增强工作。我们使用 input 函数来接受用户的注释内容,并通过 len 函数来检查输入内容的长度,以检查用户是否确实输入了什么内容。如果用户未输入任何内容而直接敲下了 enter 键(也许这份备份只是一份例行备份而没作出什么特殊的修改),那么我们将继续我们以前所做的工作。
不过,如果用户输入了某些注释内容,那么它将会被附加进 zip 文件的文件名之中,处在 .zip 扩展名之前。在这里需要注意的是我们用下划线替换注释中的空格——这是因为管理没有空格的文件名总会容易得多。