我的编程空间,编程开发者的网络收藏夹
学习永远不晚

从0开始的Python学习013编写一个

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

从0开始的Python学习013编写一个

通过之前的学习我们已经了解了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命令。这样做的一个优势是在你结合使用targzip命令的时候,备份会更快更小。如果你想要在Windows中使用这些归档,WinZip也能方便地处理这些.tar.gz文件。tar命令在大多数Linux/Unix系统中都是默认可用的。

软件的开发过程


现在,我们已经走过了编写一个软件的各个环节。这些环节可以概括如下:

  1. 什么(分析)
  2. 如何(设计)
  3. 编写(实施)
  4. 测试(测试与调试)
  5. 使用(实施或开发)
  6. 维护(优化)

重要
我们创建这个备份脚本的过程是编写程序的推荐方法——进行分析与设计。开始时实施一个简单的版本。对它进行测试与调试。使用它以确信它如预期那样地工作。再增加任何你想要的特性,根据需要一次次重复这个编写-测试-使用的周期。记住“软件是长出来的,而不是建造的”。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

从0开始的Python学习013编写一个

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

从0开始的Python学习013编写一个

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

从0开始的Python学习011模块

简介你已经学习了如何在你的程序中定义一次函数而重用代码。如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块。模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件
2023-01-31

从0开始的Python学习009参数

默认参数对于参数有时候我们希望他是可选的,前面介绍了函数柯里化,当然还有其他的解决方案。如果不想给某些参数提供值的话,就让这写参数使用默认值。在函数定义的时候给参数赋值使用(参数,参数=值......),从而给形参指定默认值。注意默认参数的
2023-01-31

从0开始的Python学习019更多的P

书接上文,接演Python全传话说学了这么多Python的基础知识,也该写一点让别人看不懂的代码了。lambdalambda表达式,是一个方法的简化形似,它没有自己的代码块,它后面的语句就是它的逻辑主体。lambda语句被用来创建新的函数对
2023-01-31

从0开始的Python学习018更多的P

特殊的方法之前学习的都是一些常用的方法,为了使我们的学习更加的完整,我们在这里学习一些特殊的方法。一般说来,特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元组一样),那么你只需要实现__g
2023-01-31

从0开始的Python学习015输入与输

简介在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题。复习得到输入用的是input(),完成输出用的是print(
2023-01-31

从0开始的Python学习014面向对象

简介到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。类和对象是面向对象编程的两个重要方面。对于类和对象的关系,举个例
2023-01-31

从0开始的Python学习001快速上手

假设大家已经安装好python的环境了。Windows检查是否可以运行python脚本Ctrl+R 输入 cmd在命令行中输入python如果出现下面结果,我们就可以开始python的学习了。第一个python脚本我使用的python自带的
2023-01-31

从零开始的Python学习Episode

一、输入与输出1.输入input("number:")num = input("number:")下面一段可以把输入的信息存在num中。注意:输入的信息会被认为是字符串,如果要输入数字进行运算要先把输入的信息进行强制类型转换,如result
2023-01-30

python学习快人一步,从19个语法开

Python简单易学,但又博大精深。许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉。学海无涯,我们先来了解一些Python中最基本的内容。Python的特点解释型语言,无需编译即可运行提供了交互式命
2023-01-31

从一个爬虫开始ChatGPT的编程秀

这篇文章主要为大家介绍了从一个爬虫开始ChatGPT的编程秀,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录