Byte Of Python(解决问题)
程序是成长起来的,不是搭建的。(Software is grown, not built.)
我想要一款程序来备份我所有的重要文件。
我们需要先进行一些分析(Analysis)。例如,我们应该如何指定哪些文件是我们需要备份的?它们应该如何进行备份?储存到哪里?
在正确分析了这些问题过后,我们便开始设计(Design)我们的程序。我们将列出一份关于我们的程序如何运转的清单。
- 需要备份的文件与目录应在一份列表中予以指定。
- 备份必须存储在一个主备份目录中。
- 备份文件将打包压缩成zip文件。
- zip压缩文件的文件名由当前日期与时间构成。
- 我们使用任何GNU/Linux或Unix发行版中都会默认的标准zip命令打包。
第一版解决方案:
由于我们的程序设计方案现在已经相当稳定,我们便可以开始编写代码,这个过程我们称之为实现(implementation)。
#_author: AYan #date: 2017/11/2 import os import time # 1.需要备份的文件与目录将被 # 指定在一个列表中 # 例如在windows下 source = ['"D:\\backup.txt"', 'D:\\docu'] # 又例如在Mac OS X与 Linux下: #source = ['/Users/swa/notes'] #在这里要注意到我们必须在字符串中使用双引号 #用以括起其中包含的空格的名称。 # 2.备份文件必须存储在一个 # 主备份目录中 # 例如在Windows下: target_dir = 'D:\\docu' # 又例如在Mac OS X 与 Linux下: #target_dir = '/Users/swa/backup' #要记得这里的目录地址修改至你将使用的路径 # 3.备份文件将压缩打包成zip文件 # 4.zip压缩文件的文件名由当前日期与时间构成 #target = target_dir + os.sep + \ # time.strftime('%Y%m%d%H%M%S') + '.zip' target = target_dir + os.sep + \ time.strftime('%Y%m%d%H%M%S') + '.zip' # 如果目标目录不存在,则进行创建 if not os.path.exists(target_dir): os.mkdir(target_dir) # 创建目录 # 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')
可以用逆向思维倒推。如果想要将一个目录及文件备份,则需要使用zip命令。而zip命令中需要目标目录及文件、备份文件。由此我们可以知道接下来要将这个命令补齐,
那么我们要拼接字符串组成命令的形式。因此需要几个变量——目标目录、分隔符、压缩后文件名、文件格式(.zip)、备份文件。
现在我们正处于测试(Testing)阶段,在这一阶段我们测试我们的程序是否能正常工作。如果其行为不符合我们的预期,那么我们需要对我们的程序进行Debug工作,也就是说
移除程序中的Bug(错误)。
如果测试通过,说明我们拥有了一份可以正常工作的备份脚本,我们可以在任何我们需要备份的文件的时候使用它。这被称为软件的操作(Operation)或部署(Deployment)。
我们的第一版脚本已经能够正常工作。然而,我们还可以对它作出一些改进,从而使它能够更好地在每一天都可以正常工作。我们将这一阶段称之为软件的维护(Maintenance)阶段。
第二版
改进一种更好的命名机制——使用时间作为主文件名,存储在以当前日期为名字的文件夹中。
#_author: AYan #date: 2017/11/2 import os import time # 1.需要备份的文件与目录将被 # 指定在一个列表中 # 例如在windows下 source = ['"D:\\backup.txt"', 'D:\\docu'] # 又例如在Mac OS X与 Linux下: #source = ['/Users/swa/notes'] #在这里要注意到我们必须在字符串中使用双引号 #用以括起其中包含的空格的名称。 # 2.备份文件必须存储在一个 # 主备份目录中 # 例如在Windows下: target_dir = 'D:\\docu' # 又例如在Mac OS X 与 Linux下: #target_dir = '/Users/swa/backup' #要记得这里的目录地址修改至你将使用的路径 # 3.备份文件将压缩打包成zip文件 # 4.将当前日期作为主备份目录下的子目录名称 today = target_dir + os.sep + time.strftime('%Y%m%d') #将当前时间作为zip文件的文件名 now = time.strftime('%H%M%S') target = today + os.sep + now + '.zip' # 如果目标目录不存在,则进行创建 if not os.path.exists(target_dir): os.mkdir(target_dir) # 创建目录 #如果子目录不存在,则进行创建 if not os.path.exists(today): os.mkdir(today) print('Successful created directory', today) # 5. 我们使用zip命令将文件打包成zip格式 # 此处target是一个带路径的目标文件,目录是D:\\docu\\today,文件名是now.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')
第三版
通过用户提供的注释内容添加到文件名中来实现。
#_author: AYan #date: 2017/11/2 import os import time # 1.需要备份的文件与目录将被 # 指定在一个列表中 # 例如在windows下 source = ['"D:\\backup.txt"', 'D:\\docu'] # 又例如在Mac OS X与 Linux下: #source = ['/Users/swa/notes'] #在这里要注意到我们必须在字符串中使用双引号 #用以括起其中包含的空格的名称。 # 2.备份文件必须存储在一个 # 主备份目录中 # 例如在Windows下: target_dir = 'D:\\docu' # 又例如在Mac OS X 与 Linux下: #target_dir = '/Users/swa/backup' #要记得这里的目录地址修改至你将使用的路径 # 3.备份文件将压缩打包成zip文件 # 4.将当前日期作为主备份目录下的子目录名称 today = target_dir + os.sep + time.strftime('%Y%m%d') #将当前时间作为zip文件的文件名 now = time.strftime('%H%M%S') # 添加一条来自用户的注释以创建 # zip文件的文件名 comment = input('Enter the 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(target_dir): os.mkdir(target_dir) # 创建目录 #如果子目录不存在,则进行创建 if not os.path.exists(today): os.mkdir(today) print('Successful created directory', today) # 5. 我们使用zip命令将文件打包成zip格式 # 此处target是一个带路径的目标文件,目录是D:\\docu\\today,文件名是now.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')
软件开发流程:
我们已经经历了开发一款软件的流程中的各个阶段(Phases)。现在可以将这些阶段总结如下:
- 分析:What(做什么)
- 设计:How(怎么做)
- 执行:Do it(开始做)
- 测试与修复错误:Test(测试)
- 操作或开发:Use(使用)
- 改进:Maintain(维护)
编写程序时推荐的一种方式是遵循我们在编写备份脚本时所经历的步骤:
进行分析和设计;开始实现一个简单的版本;测试并修复错误;开始使用以确保工作状况皆如期望那般。
现在你可以添加任何你所希望拥有的功能,并继续去重复这“开始做——测试——使用”循环,需要做多少次就做多少次。