从0开始的Python学习013编写一个Python脚本
通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本。
问题
需求:
我想要一个可以给我备份重要文件的程序。
需求分析:
首先文件是有存储路径,文件的路径和备份的路径,是一个文件还是很多文件,备份成什么样子的文件?
简单的分析过后,大概制定实现步骤:
1.需要备份的文件和目录由一个列表指定。
2.备份应该保存在主备份目录下。
3.文件备份成一个zip文件。
4.zip存档的名称是当前的日期和时间。
解决方案
当我们完成基本的程序设计的时候,就可以编写我们的代码了,这就是需求的实现过程。
版本一
import os
import time #1.带备份文件路径或者完整地址加文件名
source = ['E:\python\\']#\\被转义 #2.文件备份地址
target_dir = 'E:\\backup\\' #3.备份后的文件路径加文件名
target = target_dir + time.strftime('%Y%m%d%H%M%S') + '.rar' #4.使用zip命令压缩文件zip命令有一些选项和参数。-q选项用来表示zip命令安静地工作。-r选项表示zip命令对目录递归地工作,即它包括子目录以及子目录中的文件。
zip_command = "zip -qr {0} {1}".format(target, ''.join(source)) #5.通过给系统传递参数来执行压缩命令(压缩使用的是WinRAR所带文件rar.exe来执行压缩)
if os.system(zip_command) == 0:#如果命令成功运行,它返回0,否则它返回错误号。
print ('Successful backup to', target)
else:
print ('Backup FAILED')
运行结果



当然程序是可以不断优化的,没有最优只有更优。
测试
现在我们做的就是程序的测试,在这个阶段首先查看程序是否能正常运行,其次是查看运行结果是否与需求一致,如果和我们的预期结果不一致,我们就要调试我们的程序,从而消除“bug”。
工作原理
我们使用了os和time模块,所以我们引用他们import。之后我们在source列表中指定需要备份的文件和目录。目标目录是我们想要存储备份文件的地方,它由target_dir变量指定。zip归档的名称是目前的日期和时间(可改的),我们使用time.strftime()函数获得。它还包括.zip扩展名,将被保存在target_dir目录中。
time.strftime()函数需要我们在上面的程序中使用的那种制定。%Y会被无世纪的年份所替代。%m会被01~12之间的一个是十进制月份数替代,其他以此类推。
我们使用加法操作符来连接字符串,把两个字符串连接在一起返回一个新的字符串。通过这个方式我们创建目标文件的名称。接着我们创建zip_command字符串,它包含我们将要执行的命令。你可以在DOS中运行它,检验是否正确。
zip命令有一些选项和参数。-q选项用来表示zip命令安静地工作。-r选项表示zip命令对目录递归地工作,即它包括子目录以及子目录中的文件。两个选项可以组合成缩写形式-qr。选项后面跟着待创建的zip归档的名称,然后再是待备份的文件和目录列表。我们使用已经学习过的字符串join方法把source列表转换为字符串。{0}表示target,{1}表示''.join(source)。
最后,我们使用os.system函数 运行 命令,利用这个函数就好像在 系统 中运行命令一样。即在shell中运行命令——如果命令成功运行,它返回0,否则它返回错误号。根据命令的输出,我们打印对应的消息,显示备份是否创建成功。
版本二
第一个脚本已经可以工作了,然而我们还可以对他进行优化,使它更强大。
优化之一是采用更好的文件名机制——使用 时间 作为文件名,而当前的 日期 作为目录名,存放在主备份目录中。这样做的一个优势是你的备份会以等级结构存储,因此它就更加容易管理了。另外一个优势是文件名的长度也可以变短。还有一个优势是采用各自独立的文件夹可以帮助你方便地检验你是否在每一天创建了备份,因为只有在你创建了备份,才会出现那天的目录。
import os
import time #1.带备份文件路径或者完整地址加文件名
source = ['E:\python\\'] #2.文件备份地址
target_dir = 'E:\\backup\\' #3.使用日期创建一个文件路径
today = target_dir + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S') #4.判断这个路径是否存在,不存在新建路径
if not os.path.exists(today):
os.mkdir(tody)
print('Successfully created directory',tody) #5.备份后的文件路径加文件名os.sep = \\
target = today + os.sep + now + '.zip' #5.使用zip命令压缩文件zip命令有一些选项和参数。-q选项用来表示zip命令安静地工作。-r选项表示zip命令对目录递归地工作,即它包括子目录以及子目录中的文件。
zip_command = "zip -qr {0} {1}".format(target, ''.join(source)) #6.通过给系统传递参数来执行压缩命令(压缩使用的是WinRAR所带文件rar.exe来执行压缩)
if os.system(zip_command) == 0:
print ('Successful backup to', target)
else:
print ('Backup FAILED')
运行结果


两个程序的大部分是相同的。改变的部分主要是使用os.exists函数检验在主备份目录中是否有以当前日期作为名称的目录。如果没有,我们使用os.mkdir函数创建。
注意os.sep变量的用法——这会根据你的操作系统给出目录分隔符,即在Linux、Unix下它是'/',在Windows下它是'\\',而在Mac OS下它是':'。使用os.sep而非直接使用字符,会使我们的程序具有移植性,可以在上述这些系统下工作。
版本三
import os
import time #1.带备份文件路径或者完整地址加文件名
source = ['E:\python\\'] #2.文件备份地址
target_dir = 'E:\\backup\\' #3.使用日期创建一个文件路径
today = target_dir + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S') #4.从用户处获取注释以创建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' #5.判断这个路径是否存在,不存在新建路径
if not os.path.exists(today):
os.mkdir(today)
print('Successfully created directory',tody) #6.使用zip命令压缩文件zip命令有一些选项和参数。-q选项用来表示zip命令安静地工作。-r选项表示zip命令对目录递归地工作,即它包括子目录以及子目录中的文件。
zip_command = "zip -qr {0} {1}".format(target, ''.join(source)) #7.通过给系统传递参数来执行压缩命令(压缩使用的是WinRAR所带文件rar.exe来执行压缩)
if os.system(zip_command) == 0:
print ('Successful backup to', target)
else:
print ('Backup FAILED')
运行结果


如何工作
这个程序现在工作了!让我们看一下版本三中作出的实质性改进。我们使用input函数得到用户的注释,然后通过len函数找出输入的长度以检验用户是否确实输入了什么东西。如果用户只是按了回车(比如这只是一个惯例备份,没有做什么特别的修改),那么我们就如之前那样继续操作。
然而,如果提供了注释,那么它会被附加到zip归档名,就在.zip扩展名之前。注意我们把注释中的空格替换成下划线——这是因为处理这样的文件名要容易得多。
进一步优化
另一个可能的改进是使文件和目录能够通过命令行直接传递给脚本。我们可以通过sys.argv列表来获取它们,然后我们可以使用list类提供的extend方法把它们加到source列表中去。
我还希望有的一个优化是使用tar命令替代zip命令。这样做的一个优势是在你结合使用tar和gzip命令的时候,备份会更快更小。如果你想要在Windows中使用这些归档,WinZip也能方便地处理这些.tar.gz文件。tar命令在大多数Linux/Unix系统中都是默认可用的。
软件的开发过程
现在,我们已经走过了编写一个软件的各个环节。这些环节可以概括如下:
- 什么(分析)
- 如何(设计)
- 编写(实施)
- 测试(测试与调试)
- 使用(实施或开发)
- 维护(优化)
重要
我们创建这个备份脚本的过程是编写程序的推荐方法——进行分析与设计。开始时实施一个简单的版本。对它进行测试与调试。使用它以确信它如预期那样地工作。再增加任何你想要的特性,根据需要一次次重复这个编写-测试-使用的周期。记住“软件是长出来的,而不是建造的”。
从0开始的Python学习013编写一个Python脚本的更多相关文章
- 简明python教程六----编写一个python脚本
备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...
- python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数。如果不存在这样一对整数,则输入一条消息进行说明。
python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数.如果不存在这样一对整数,则输入一条消息 ...
- python学习之路-1 python简介及安装方法
python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...
- python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍
目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- python学习第四讲,python基础语法之判断语句,循环语句
目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...
- python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明。
python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明. 重难点:通过input函数输入的行消息为字符串格式,必须转换为整型,否则 ...
- python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。
python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...
- python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍
目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...
随机推荐
- PowerDesigner制作UMI图
首先我们要下载一个PowerDesigner,自己上百度下载哈!嘻嘻!!! 我这个是汉化版的 然后点这个,再到空白的地方点一下就创建好了. 然后单击右边箭头然后双击 不管是制作的图还是代码生成的图都可 ...
- 设计模式之创建类模式PK
创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型 ...
- ubuntu安装mysql没有让我设置密码
终端输入: sudo cat /etc/mysql/debian.cnf显示内容:# Automatically generated for Debian scripts. DO NOT TOUCH! ...
- Linux文件系统类型和区别
文件系统EXT3,EXT4和XFS的区别: 1. EXT3 (1)最多只能支持32TB的文件系统和2TB的文件,实际只能容纳2TB的文件系统和16GB的文件 (2)Ext3目前只支持32000个子目录 ...
- 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它
本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...
- python接口自动化(七)--状态码详解对照表(详解)
简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...
- WebPack引用Bootstrap 无法使用图标的结局方案
npm i https://github.com/iconic/open-iconic.git -D 因为boostrap的css里删除了图标 分开了 我们在引入个呵呵. 下载:npm i boot ...
- ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下ViewPager和自定义布局view的搭配使用以及布局文件中单选效果.获取viewpager布局内部值的功能. 效果图 ...
- spring里的三大拦截器
Filter 新建 TimeFilter @Component public class TimeFilter implements Filter { @Override public void in ...
- springcloud情操陶冶-bootstrapContext(三)
本文则将重点阐述context板块的自动配置类,观察其相关的特性并作相应的总结 自动配置类 直接查看cloudcontext板块下的spring.factories对应的EnableAutoConfi ...