⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch10s02.html

📁 《简明 Python 教程》为 "A Byte of Python" 的唯一指定简体中文译本
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><style type="text/css"><!--@import url(stylesheet/text.css);@import url(stylesheet/box.css);--></style><title>简明 Python 教程 / 解决问题——编写一个Python脚本 / 解决方案 </title></head><body><table width="100%"><tr><th colspan="3" align="center"><span class="header">简明 Python 教程</span></th></tr><th colspan="3" align="center">第10章 解决问题——编写一个Python脚本</th><tr><th width="20%" align="left"><a href="ch10.html#s01">上一页</a></th><th width="60%" align="center"><span class="header2">解决方案</span></th><th align="right"><a href="ch10s03.html">下一页</a></th></tr></table><hr noshade><h1>解决方案</h1><p>当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的<strong>实施</strong>。</p><h2><a name="first">版本一</a></h2><p class="exampletitle"><a name="e101">例10.1 备份脚本——版本一</a></p><p class="filebox"><code class="comment">#!/usr/bin/python<br># Filename: backup_ver1.py</code><br><br><code class="key">import </code><code class="func">os</code><br><code class="key">import </code><code class="func">time</code><br><br><code class="comment"># 1. The files and directories to be backed up are specified in a list.</code><br><code>source = [</code><code class="cite">'/home/swaroop/byte'</code><code>, </code><code class="cite">'/home/swaroop/bin'</code><code>]</code><br><code class="comment"># If you are using Windows, use source = [r'C:\Documents', r'D:\Work'] or something like that<br><br># 2. The backup must be stored in a main backup directory</code><br><code>target_dir = </code><code class="cite">'/mnt/e/backup/' </code><code class="comment"># Remember to change this to what you will be using</code><br><br><code class="comment"># 3. The files are backed up into a zip file.<br># 4. The name of the zip archive is the current date and time</code><br><code>target = target_dir + </code><code class="func">time</code><code>.strftime(</code><code class="cite">'%Y%m%d%H%M%S'</code><code>) + </code><code class="cite">'.zip'</code><br><br><code class="comment"># 5. We use the zip command (in Unix/Linux) to put the files in a zip archive</code><br><code>zip_command = </code><code class="cite">"zip -qr '%s' %s" </code><code>% (target, </code><code class="cite">' '</code><code>.join(source))</code><br><br><code class="comment"># Run the backup</code><br><code class="key">if </code><code class="func">os</code><code>.system(zip_command) == </code><code class="cite">0</code><code>:</code><br><code class="key">&nbsp;&nbsp;&nbsp;&nbsp;print </code><code class="cite">'Successful backup to'</code><code>, target</code><br><code class="key">else</code><code>:</code><br><code class="key">&nbsp;&nbsp;&nbsp;&nbsp;print </code><code class="cite">'Backup FAILED'</code></p><p>(源文件:<a href="code/backup_ver1.py">code/backup_ver1.py</a>)</p><h2>输出</h2><p class="codebox"><code>$ python backup_ver1.py<br>Successful backup to /mnt/e/backup/20041208073244.zip</code></p><p>现在,我们已经处于<strong>测试</strong>环节了,在这个环节,我们测试我们的程序是否正确工作。如果它与我们所期望的不一样,我们就得<strong>调试</strong>我们的程序,即消除程序中的 <dfn>瑕疵</dfn> (错误)。</p><h2>它如何工作</h2><p>接下来你将看到我们如何把 <dfn>设计</dfn> 一步一步地转换为 <dfn>代码</dfn> 。</p><p>我们使用了<code>os</code>和<code>time</code>模块,所以我们输入它们。然后,我们在<code>source</code>列表中指定需要备份的文件和目录。目标目录是我们想要存储备份文件的地方,它由<code>target_dir</code>变量指定。zip归档的名称是目前的日期和时间,我们使用<code>time.strftime()</code>函数获得。它还包括<code>.zip</code>扩展名,将被保存在<code>target_dir</code>目录中。</p><p><code>time.strftime()</code>函数需要我们在上面的程序中使用的那种定制。<code>%Y</code>会被无世纪的年份所替代。<code>%m</code>会被01到12之间的一个十进制月份数替代,其他依次类推。这些定制的详细情况可以在《Python参考手册》中获得。《Python参考手册》包含在你的Python发行版中。注意这些定制与用于<code>print</code>语句的定制(<code>%</code>后跟一个元组)类似(但不完全相同)</p><p>我们使用加法操作符来 <dfn>级连</dfn> 字符串,即把两个字符串连接在一起返回一个新的字符串。通过这种方式,我们创建了目标zip文件的名称。接着我们创建了<code>zip_command</code>字符串,它包含我们将要执行的命令。你可以在shell(Linux终端或者DOS提示符)中运行它,以检验它是否工作。</p><p><strong>zip</strong>命令有一些选项和参数。<code>-q</code>选项用来表示zip命令<strong>安静地</strong>工作。<code>-r</code>选项表示zip命令对目录<strong>递归地</strong>工作,即它包括子目录以及子目录中的文件。两个选项可以组合成缩写形式<code>-qr</code>。选项后面跟着待创建的zip归档的名称,然后再是待备份的文件和目录列表。我们使用已经学习过的字符串<code>join</code>方法把<code>source</code>列表转换为字符串。</p><p>最后,我们使用<code>os.system</code>函数 <dfn>运行</dfn> 命令,利用这个函数就好像在 <dfn>系统</dfn> 中运行命令一样。即在shell中运行命令——如果命令成功运行,它返回0,否则它返回错误号。</p><p>根据命令的输出,我们打印对应的消息,显示备份是否创建成功。好了,就是这样我们已经创建了一个脚本来对我们的重要文件做备份!</p><p class="notebox"><span class="boxtitle">给Windows用户的注释</span><br>你可以把<code>source</code>列表和<code>target</code>目录设置成任何文件和目录名,但是在Windows中你得小心一些。问题是Windows把反斜杠(\)作为目录分隔符,而Python用反斜杠表示转义符!<br>所以,你得使用转义符来表示反斜杠本身或者使用自然字符串。例如,使用<code>'C:\\Documents'</code>或<code>r'C:\Documents'</code>而<strong>不是</strong><code>'C:\Documents'</code>——你在使用一个不知名的转义符<code>\D</code>!</p><p>现在我们已经有了一个可以工作的备份脚本,我们可以在任何我们想要建立文件备份的时候使用它。建议Linux/Unix用户使用前面介绍的<a href="ch03s05.html">可执行的方法</a>,这样就可以在任何地方任何时候运行备份脚本了。这被称为软件的<strong>实施</strong>环节或<strong>开发</strong>环节。</p><p>上面的程序可以正确工作,但是(通常)第一个程序并不是与你所期望的完全一样。例如,可能有些问题你没有设计恰当,又或者你在输入代码的时候发生了一点错误,等等。正常情况下,你应该回到设计环节或者调试程序。</p><h2><a name="second">版本二</a></h2><p>第一个版本的脚本可以工作。然而,我们可以对它做些优化以便让它在我们的日常工作中变得更好。这称为软件的<strong>维护</strong>环节。</p><p>我认为优化之一是采用更好的文件名机制——使用 <dfn>时间</dfn> 作为文件名,而当前的 <dfn>日期</dfn> 作为目录名,存放在主备份目录中。这样做的一个优势是你的备份会以等级结构存储,因此它就更加容易管理了。另外一个优势是文件名的长度也可以变短。还有一个优势是采用各自独立的文件夹可以帮助你方便地检验你是否在每一天创建了备份,因为只有在你创建了备份,才会出现那天的目录。</p><p class="exampletitle"><a name="e102">例10.2 备份脚本——版本二</a></p><p class="filebox"><code class="comment">#!/usr/bin/python<br># Filename: backup_ver2.py</code><br><br><code class="key">import </code><code class="func">os</code><br><code class="key">import </code><code class="func">time</code><br><br><code class="comment"># 1. The files and directories to be backed up are specified in a list.</code><br><code>source = [</code><code class="cite">'/home/swaroop/byte'</code><code>, </code><code class="cite">'/home/swaroop/bin'</code><code>]</code><br><code class="comment"># If you are using Windows, use source = [r'C:\Documents', r'D:\Work'] or something like that<br><br># 2. The backup must be stored in a main backup directory</code><br><code>target_dir = </code><code class="cite">'/mnt/e/backup/' </code><code class="comment"># Remember to change this to what you will be using</code><br><br><code class="comment"># 3. The files are backed up into a zip file.<br># 4. The current day is the name of the subdirectory in the main directory</code><br><code>today = target_dir + </code><code class="func">time</code><code>.strftime(</code><code class="cite">'%Y%m%d'</code><code>)</code><br><code class="comment"># The current time is the name of the zip archive</code><br><code>now = </code><code class="func">time</code><code>.strftime(</code><code class="cite">'%H%M%S'</code><code>)</code><br><br><code class="comment"># Create the subdirectory if it isn't already there</code><br><code class="key">if not </code><code class="func">os</code><code>.path.exists(today):</code><br><code class="func">&nbsp;&nbsp;&nbsp;&nbsp;os</code><code>.mkdir(today) </code><code class="comment"># make directory</code><br><code class="key">&nbsp;&nbsp;&nbsp;&nbsp;print </code><code class="cite">'Successfully created directory'</code><code>, today</code><br><br><code class="comment"># The name of the zip file</code><br><code>target = today + </code><code class="func">os</code><code>.sep + now + </code><code class="cite">'.zip'</code><br><br><code class="comment"># 5. We use the zip command (in Unix/Linux) to put the files in a zip archive</code><br><code>zip_command = </code><code class="cite">"zip -qr '%s' %s" </code><code>% (target, </code><code class="cite">' '</code><code>.join(source))</code><br><br><code class="comment"># Run the backup</code><br><code class="key">if </code><code class="func">os</code><code>.system(zip_command) == </code><code class="cite">0</code><code>:</code><br><code class="key">&nbsp;&nbsp;&nbsp;&nbsp;print </code><code class="cite">'Successful backup to'</code><code>, target</code><br><code class="key">else</code><code>:</code><br><code class="key">&nbsp;&nbsp;&nbsp;&nbsp;print </code><code class="cite">'Backup FAILED'</code></p><p>(源文件:<a href="code/backup_ver2.py">code/backup_ver2.py</a>)</p><h2>输出</h2><p class="codebox"><code>$ python backup_ver2.py<br>Successfully created directory /mnt/e/backup/20041208<br>Successful backup to /mnt/e/backup/20041208/080020.zip<br><br>$ python backup_ver2.py<br>Successful backup to /mnt/e/backup/20041208/080428.zip</code></p><h2>它如何工作</h2><p>两个程序的大部分是相同的。改变的部分主要是使用<code>os.exists</code>函数检验在主备份目录中是否有以当前日期作为名称的目录。如果没有,我们使用<code>os.mkdir</code>函数创建。</p><p>注意<code>os.sep</code>变量的用法——这会根据你的操作系统给出目录分隔符,即在Linux、Unix下它是<code>'/'</code>,在Windows下它是<code>'\\'</code>,而在Mac OS下它是<code>':'</code>。使用<code>os.sep</code>而非直接使用字符,会使我们的程序具有移植性,可以在上述这些系统下工作。</p><h2><a name="third">版本三</a></h2><p>第二个版本在我做较多备份的时候还工作得不错,但是如果有极多备份的时候,我发现要区分每个备份是干什么的,会变得十分困难!例如,我可能对程序或者演讲稿做了一些重要的改变,于是我想要把这些改变与zip归档的名称联系起来。这可以通过在zip归档名上附带一个用户提供的注释来方便地实现。</p><p class="exampletitle"><a name="e103">例10.3 备份脚本——版本三(不工作!)</a></p><p class="filebox"><code class="comment">#!/usr/bin/python<br># Filename: backup_ver3.py</code><br><br><code class="key">import </code><code class="func">os</code><br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -