版本一

解决方案
当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。
版本一
例10.1 备份脚本——版本一

#!/usr/bin/python
# Filename: backup_ver1.py
import os
import time
#1. The files and directories to be backed up arespecified in a list.
source = ['/python', '/root/mysql']
# If you are using Windows, use source =[r'C:\Documents', r'D:\Work'] or something like that
# 2. The backup must be stored in a main backupdirectory
target_dir='/pythonbak'
# Remember to change thisto what you will be using
# 3. The files are backed up into a zip file.
# 4. The name of the zip archive is the current date andtime
target=target_dir+'/'+time.strftime('%Y%m%d%H%M%S')+'.zip'
# 5. We use the zip command (in Unix/Linux) to put thefiles in a zip archive
zip_command="zip -qr '%s' %s"%(target, ' '.join(source))
#Run the backp
if os.system(zip_command)==0:
print 'Successful backup to',target
else:
print 'Backup FAILED'
print target
print zip_command

输出
[root@losnau python]# python backup_ver1.py
Successful backup to /pythonbak/20160806200321.zip
/pythonbak/20160806200321.zip
zip -qr '/pythonbak/20160806200321.zip' /python /root/mysql

它如何工作
接下来你将看到我们如何把 设计 一步一步地转换为 代码 。
我们使用了os和time模块,所以我们输入它们。然后,我们在source列表中指定需要备份的文件和目录。目标目录是我们想要存储备份文件的地方,它由target_dir变量指定。zip归档的名称是目前的日期和时间,我们使用time.strftime()函数获得。它还包括.zip扩展名,将被保存在target_dir目录中。
time.strftime()函数需要我们在上面的程序中使用的那种定制。%Y会被无世纪的年份所替代。%m会被01到12之间的一个十进制月份数替代,其他依次类推。这些定制的详细情况可以在《Python参考手册》中获得。《Python参考手册》包含在你的Python发行版中。注意这些定制与用于print语句的定制(%后跟一个元组)类似(但不完全相同)
我们使用加法操作符来 级连 字符串,即把两个字符串连接在一起返回一个新的字符串。通过这种方式,我们创建了目标zip文件的名称。接着我们创建了zip_command字符串,它包含我们将要执行的命令。你可以在shell(Linux终端或者DOS提示符)中运行它,以检验它是否工作。
zip命令有一些选项和参数。-q选项用来表示zip命令安静地工作。-r选项表示zip命令对目录递归地工作,即它包括子目录以及子目录中的文件。两个选项可以组合成缩写形式-qr。选项后面跟着待创建的zip归档的名称,然后再是待备份的文件和目录列表。我们使用已经学习过的字符串join方法把source列表转换为字符串。
最后,我们使用os.system函数 运行 命令,利用这个函数就好像在 系统 中运行命令一样。即在shell中运行命令——如果命令成功运行,它返回0,否则它返回错误号。
根据命令的输出,我们打印对应的消息,显示备份是否创建成功。好了,就是这样我们已经创建了一个脚本来对我们的重要文件做备份!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

给Windows用户的注释你可以把source列表和target目录设置成任何文件和目录名,但是在Windows中你得小心一些。问题是Windows把反斜杠(\)作为目录分隔符,而Python用反斜杠表示转义符!所以,你得使用转义符来表示反斜杠本身或者使用自然字符串。例如,使用'C:\\Documents'或r'C:\Documents'而不是'C:\Documents'——你在使用一个不知名的转义符\D!
现在我们已经有了一个可以工作的备份脚本,我们可以在任何我们想要建立文件备份的时候使用它。建议Linux/Unix用户使用前面介绍的可执行的方法,这样就可以在任何地方任何时候运行备份脚本了。这被称为软件的实施环节或开发环节。
上面的程序可以正确工作,但是(通常)第一个程序并不是与你所期望的完全一样。例如,可能有些问题你没有设计恰当,又或者你在输入代码的时候发生了一点错误,等等。正常情况下,你应该回到设计环节或者调试程序。


    版本二

第一个版本的脚本可以工作。然而,我们可以对它做些优化以便让它在我们的日常工作中变得更好。这称为软件的维护环节。
我认为优化之一是采用更好的文件名机制——使用 时间 作为文件名,而当前的 日期 作为目录名,存放在主备份目录中。这样做的一个优势是你的备份会以等级结构存储,因此它就更加容易管理了。另外一个优势是文件名的长度也可以变短。还有一个优势是采用各自独立的文件夹可以帮助你方便地检验你是否在每一天创建了备份,因为只有在你创建了备份,才会出现那天的目录。
例10.2 备份脚本——版本二

#!/usr/bin/python
# Filename: backup_ver2.py
import os
import time
#1. The files and directories to be backed up arespecified in a list.
source = ['/python', '/root/mysql']
# If you are using Windows, use source =[r'C:\Documents', r'D:\Work'] or something like that
# 2. The backup must be stored in a main backupdirectory
target_dir='/pythonbak'
# Remember to change thisto what you will be using
# 3. The files are backed up into a zip file.
# 4. The current day is the name of the subdirectory inthe main directory
today=target_dir+'/'+time.strftime('%Y%m%d')
# The current time is the name of the zip archive
now=time.strftime('%H%M%S')
# Create the sudbirectory if it isn't already there
if not os.path.exists(today):
os.mkdir(today)
print 'Successfully created %s directory'%today
else:
print 'Directory %s already exist!'%today
# The name of the zip file
target = today + os.sep + now + '.zip'
# 5. We use the zip command (in Unix/Linux) to put thefiles in a zip archive
zip_command="zip -qr '%s' %s"%(target, ' '.join(source))
#Run the backp
if os.system(zip_command)==0:
print 'Successful backup to',target
else:
print 'Backup FAILED'
#print target
#print zip_command

输出
[root@losnau python]# python backup_ver2.py
Directory /pythonbak/20160806 already exist!
Successful backup to /pythonbak/20160806/200611.zip

它如何工作
两个程序的大部分是相同的。改变的部分主要是使用os.exists函数检验在主备份目录中是否有以当前日期作为名称的目录。如果没有,我们使用os.mkdir函数创建。
注意os.sep变量的用法——这会根据你的操作系统给出目录分隔符,即在Linux、Unix下它是'/',在Windows下它是'\\',而在Mac OS下它是':'。使用os.sep而非直接使用字符,会使我们的程序具有移植性,可以在上述这些系统下工作。


    版本四:实现与用户交互

例10.4 备份脚本——

#!/usr/bin/python
# Filename: backup_ver2.py
import os
import time
#1. The files and directories to be backed up arespecified in a list.
source = ['/python', '/root/mysql']
# If you are using Windows, use source =[r'C:\Documents', r'D:\Work'] or something like that
# 2. The backup must be stored in a main backupdirectory
target_dir='/pythonbak'
# Remember to change thisto what you will be using
# 3. The files are backed up into a zip file.
# 4. The current day is the name of the subdirectory inthe main directory
today=target_dir+'/'+time.strftime('%Y%m%d')
# The current time is the name of the zip archive
now=time.strftime('%H%M%S')
# Take a comment from the user to create the name of the zip file
comment = raw_input('Enter a comment -->')
if len(comment)==0:
target=today+os.sep+now+'.zip'
else:
target=today+os.sep+now+comment.replace(' ','_')+'.zip'
# Notice the backslash!
# Create the sudbirectory if it isn't already there
if not os.path.exists(today):
os.mkdir(today)
print 'Successfully created %s directory'%today
else:
print 'Directory %s already exist!'%today
# The name of the zip file
#target = today + os.sep + now + '.zip'
# 5. We use the zip command (in Unix/Linux) to put thefiles in a zip archive
zip_command="zip -qr '%s' %s"%(target, ' '.join(source))
#Run the backp
if os.system(zip_command)==0:
print 'Successful backup to',target
else:
print 'Backup FAILED'
#print target
#print zip_command

输出
[root@losnau python]# python backup_ver4.py
Enter a comment -->ce shi la
Directory /pythonbak/20160806 already exist!
Successful backup to /pythonbak/20160806/200959ce_shi_la.zip
[root@losnau python]# python backup_ver4.py
Enter a comment -->su ce cc ful
Directory /pythonbak/20160806 already exist!
Successful backup to /pythonbak/20160806/201010su_ce_cc_ful.zip
它如何工作
这个程序现在工作了!让我们看一下版本三中作出的实质性改进。我们使用raw_input函数得到用户的注释,然后通过len函数找出输入的长度以检验用户是否确实输入了什么东西。如果用户只是按了回车(比如这只是一个惯例备份,没有做什么特别的修改),那么我们就如之前那样继续操作。
然而,如果提供了注释,那么它会被附加到zip归档名,就在.zip扩展名之前。注意我们把注释中的空格替换成下划线——这是因为处理这样的文件名要容易得多。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

进一步优化
对于大多数用户来说,第四个版本是一个满意的工作脚本了,但是它仍然有进一步改进的空间。比如,你可以在程序中包含 交互 程度——你可以用-v选项来使你的程序更具交互性。
另一个可能的改进是使文件和目录能够通过命令行直接传递给脚本。我们可以通过sys.argv列表来获取它们,然后我们可以使用list类提供的extend方法把它们加到source列表中去。
我还希望有的一个优化是使用tar命令替代zip命令。这样做的一个优势是在你结合使用tar和gzip命令的时候,备份会更快更小。如果你想要在Windows中使用这些归档,WinZip也能方便地处理这些.tar.gz文件。tar命令在大多数Linux/Unix系统中都是默认可用的。Windows用户也可以下载安装它。
命令字符串现在将称为:
tar = 'tar -cvzf %s %s -X /home/swaroop/excludes.txt' %(target, ' '.join(srcdir))
选项解释如下:
-c表示创建一个归档。
-v表示交互,即命令更具交互性。
-z表示使用gzip滤波器。
-f表示强迫创建归档,即如果已经有一个同名文件,它会被替换。
-X表示含在指定文件名列表中的文件会被排除在备份之外。
例如,你可以在文件中指定*~,从而不让备份包括所有以~结尾的文件。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
重要最理想的创建这些归档的方法是分别使用zipfile和tarfile。它们是Python标准库的一部分,可以供你使用。使用这些库就避免了使用os.system这个不推荐使用的函数,它容易引发严重的错误。然而,我在本节中使用os.system的方法来创建备份,这纯粹是为了教学的需要。这
样的话,例子就可以简单到让每个人都能够理解,同时也已经足够用了。

编写一个python脚本功能-备份的更多相关文章

  1. 从0开始的Python学习013编写一个Python脚本

    通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本. 问题 需求: 我想要一个可以给我备份重要文件的程序. 需求分析: 首先文件是有存储路径,文件的路径和 ...

  2. Python编写一个Python脚本

    我想要一个可以为我的所有重要文件创建备份的程序.(下面测试环境为python2.7) 1.backup_ver1.py #!/usr/bin/python import os import time ...

  3. 简明python教程六----编写一个python脚本

    备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...

  4. 编写一个BAT脚本协助运维人员遇到问题时候调测数据库是否有效连接成功的操作攻略

    简单摘要: 1.内网系统出现故障需要排查 2.运维人员不熟悉数据库操作,没法通过连接数据库和执行SQL语句的方式排查数据库及数据是否正常 3.解决方案:编写一个bat脚本,运维人员双击运行即可.   ...

  5. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  6. 工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

    一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello ...

  7. shell编写一个判断脚本

                                                              shell编写一个判断脚本 4.1问题 本例要求在虚拟机server0上创建/roo ...

  8. python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...

  9. 手把手教你编写一个具有基本功能的shell(已开源)

    刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell) ...

随机推荐

  1. 转: Windows如何打开和使用事件查看器管理计算机

    方法/步骤   1 右键单击"我的电脑"(win8中名称为"这台电脑.This Computer"),选择"管理",点击. 步骤阅读 2 出 ...

  2. 软件开发常用的linux命令心得(ubuntu为例)

    软件开发过程中难免要经常对主机进行配置或者部署等操作,想到一些就写一些了,以后再更新 解压命令: a.如果是tar文件,则直接用 “tar zxvf 文件名”: b.如果是zip文件,用 “unzip ...

  3. JPA 系列教程3-单向多对一

    JPA中的@ManyToOne 主要属性 - name(必需): 设定"many"方所包含的"one"方所对应的持久化类的属性名 - column(可选): 设 ...

  4. bios自检时间长,显示0075错误

    一amibios主板,只有一IDE接口,接一硬盘一光驱,每次启动时,在bios自检界面,在检测完usb设备后,都要等个那么一两分钟,这个时候,可以在屏幕的右下角看到有数字:0075 ,这就是错误代码. ...

  5. oracle的row_number()和rownum

    row_number() 函数和rownum的介绍: 1.row_number() 方法的格式: row_number()over([partition by col1] order by col2) ...

  6. margin

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. java 接口与实现

    Computable.java public interface Computable { int MAX = 46; int f(int x); } China.java public class ...

  8. android studio sexy editor性感编辑器设置

    sexy editor下载地址:http://download.csdn.net/detail/yy1300326388/9166223 我自己也有上传CSDN资源 rainyday0524@163. ...

  9. HDU 5900

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  10. Struts2 语法--异常处理

    1. UsersDAO.java里产生一个例外: System.out.println(1/0); 2. 调用DAO的UsersAction1.java 的execute方法, 加抛异常: publi ...