2019.5.15 闷热,手机装了个xmind,一段时间整理一下当作回顾和整理。
今天学:解决问题(让人兴奋的章节名字,意味着有问题出现了)
(Software is grown, not built.)
软件开发流程:
1. What/做什么(分析)
2. How/怎么做(设计)
3. Do It/开始做(执行)
4. Test/测试(测试与修复错误)
5. Use/使用(操作或开发)
6. Maintain/维护(改进)
编写程序时推荐的一种方式是遵循我们在编写备份脚本时所经历的步骤:进行分析与设计;开始实现一个简单版本;测试并修复错误;开始使用以确保工作状况皆如期望那般。现在,你可以添加任何你所希望拥有的功能,并继续去重复这一“开始做—测试—使用”循环,需要做多少次就去做多少次。
#######################################################################################
问题:想要一款程序来备份所有的重要的文件。
分析:如何指定哪些文件是我们需要备份的?它们如何进行备份?存储到哪里?
设计(完全是个发散性个人思考行为):
需要备份的文件与目录应在一份列表中予以指定
备份需要存储在一个主备份目录中
备份文件将打包压缩成zip文件
zip压缩文件的文件名由当前日期与时间构成
不论系统都提供标准zip命令进行打包:只要有命令行界面,就能实现压缩或归档命令
实现(撸码):第一版:
adding那几个是zip命令的结果
os.sep 变量的使用方式——它将根据你的操作系统给出相应的分隔符,在GNU/Linux 与 Unix 中它会是 '/' ,在 Windows 中它会是 '\\' ,在 Mac OS 中它会是':' 。
time.strftime() 函数会遵循某些格式(Specification),其中一种就如我们在上方程序中所使用的那样。 %Y 将被替换成带有具体世纪的年份。 %m 将会被替换成以 01 至 12 的十进制数所表示的月份。
zip 命令会有一些选项与参数需要传递。-r 选项用以指定 zip 命令应该递归地(Recursively)对目录进行工作,也就是说它应该包括所有的子文件夹与其中的文件。这两个选项结合到一起并可以指定一个快捷方式作 -qr 。选项后面跟着的是将要创建的 zip 文件的名称,再往后是需要备份的文件与目录的列表。
os.system 函数的命令,这一函数可以使命令像是从系统中运行的。也就是说,从 shell 中运行的——如果运行成功,它将返回 0 ,如果运行失败,将返回一个错误代码。
这样就写出了一个备份脚本。但是远远不够,还要测试和维护:
维护:
第二版(思考)更好的文件命名机制——使用时间作为文件名,存储在以当前日期为名字的文件夹中,这一文件夹则照常存储在主备份目录下。这种机制的第一个有点在于你的备份会以分层的形式予以存储,从而使得它们能更易于管理。第二个优点是文件名能够更短。第三个优点在于由于只有当天进行了备份才会创建相应的目录,独立的目录能够帮助你快速地检查每天是否都进行了备份。
这边做了一个小测试:如果target没有加上today+os.sep+ 的话,这个文件生成在了代码目录中,而不是today文件夹下。
第三版:但当备份数量过于庞大时,我便很难找出备份之间有什么区别了。例如,我可能对我的程序或者演示文稿做了重大修改,然后我想将这些修改与 zip 文件的文件名产生关联。这可以通过将用户提供的注释内容添加到文件名中来实现。(同时要记错修复错误)
注意:str.replace(old,new[,max]) replace() 方法把字符串中的 old(旧字符串)替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
在这里需要注意的是我们用下划线替换注释中的空格——不然在mac os x里是不会显示空格后的字符:
继续改进:你可以在程序中(跟-r一起)添加 -v 选项来指定程序的显示信息的详尽程度,从而使你的程序可以更具说服力,或者是添加 -q 选项使程序能静默(Quiet)运行。
另一个可以增强的方向是在命令行中允许额外的文件与目录传递到脚本中。我们可以从sys.argv 列表中获得这些名称,然后我们可以通过 list 类提供的 extend 方法把它们添加到我们的 source 列表中。
最重要的改进方向是不使用 os.system 方法来创建归档文件,而是使用 zipfile 或 tarfile 内置的模块来创建它们的归档文件。这些都是标准库的一部分,随时供你在你的电脑上没有 zip 程序作为没有外部依赖的情况下使用这些功能。
if not os.path.exists(today):
os.mkdir(today) #尝试改成zipfile或tarfile内置的模块来创建归档文件