#!/usr/bin/python
# Filename: backup_ver1.py
import os
import time
# 1. The files and directories to be backed up are specified in a list.
source = ['/home/swaroop/byte', '/home/swaroop/bin']
# 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 backup directory
target_dir = '/mnt/e/backup/' # Remember to change this to 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 and time
target = target_dir + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 5. We use the zip command (in Unix/Linux) to put the files in a zip archive
zip_command = "zip -qr '%s' %s" % (target, ' '.join(source))
# Run the backup
if os.system(zip_command) == 0:
print 'Successful backup to', target
else:
print 'Backup FAILED'
(源文件:code/backup_ver1.py)
輸出
$ python backup_ver1.py
Successful backup to /mnt/e/backup/20041208073244.zip
現(xiàn)在,我們已經(jīng)處于測試環(huán)節(jié)了,在這個環(huán)節(jié),我們測試我們的程序是否正確工作。如果它與我們所期望的不一樣,我們就得調(diào)試我們的程序,即消除程序中的 瑕疵 (錯誤)。
它如何工作
接下來你將看到我們?nèi)绾伟?設(shè)計 一步一步地轉(zhuǎn)換為 代碼 。
我們使用了 os 和 time 模塊,所以我們輸入它們。然后,我們在 source 列表中指定需要備份的文件和目錄。目標(biāo)目錄是我們想要存儲備份文件的地方,它由 target_dir 變量指定。zip 歸檔的名稱是目前的日期和時間,我們使用 time.strftime()函數(shù)獲得。它還包括.zip 擴(kuò)展名,將被保存在 target_dir 目錄中。
time.strftime()函數(shù)需要我們在上面的程序中使用的那種定制。%Y 會被無世紀(jì)的年份所替代。%m 會被 01 到 12 之間的一個十進(jìn)制月份數(shù)替代,其他依次類推。這些定制的詳細(xì)情況可以在《Python 參考手冊》中獲得?!禤ython 參考手冊》包含在你的 Python 發(fā)行版中。注意這些定制與用于 print 語句的定制(%后跟一個元組)類似(但不完全相同)
我們使用加法操作符來 級連 字符串,即把兩個字符串連接在一起返回一個新的字符串。通過這種方式,我們創(chuàng)建了目標(biāo) zip 文件的名稱。接著我們創(chuàng)建了 zip_command 字符串,它包含我們將要執(zhí)行的命令。你可以在 shell(Linux 終端或者 DOS 提示符)中運(yùn)行它,以檢驗(yàn)它是否工作。
zip 命令有一些選項(xiàng)和參數(shù)。-q 選項(xiàng)用來表示 zip 命令安靜地工作。-r 選項(xiàng)表示 zip 命令對目錄遞歸地工作,即它包括子目錄以及子目錄中的文件。兩個選項(xiàng)可以組合成縮寫形式-qr。選項(xiàng)后面跟著待創(chuàng)建的 zip 歸檔的名稱,然后再是待備份的文件和目錄列表。我們使用已經(jīng)學(xué)習(xí)過的字符串 join 方法把 source 列表轉(zhuǎn)換為字符串。
最后,我們使用 os.system 函數(shù) 運(yùn)行 命令,利用這個函數(shù)就好像在 系統(tǒng) 中運(yùn)行命令一樣。即在 shell 中運(yùn)行命令——如果命令成功運(yùn)行,它返回 0,否則它返回錯誤號。
根據(jù)命令的輸出,我們打印對應(yīng)的消息,顯示備份是否創(chuàng)建成功。好了,就是這樣我們已經(jīng)創(chuàng)建了一個腳本來對我們的重要文件做備份!
給 Windows 用戶的注釋
你可以把 source 列表和 target 目錄設(shè)置成任何文件和目錄名,但是在 Windows 中你得小心一些。問題是 Windows 把反斜杠(\)作為目錄分隔符,而 Python 用反斜杠表示轉(zhuǎn)義符! 所以,你得使用轉(zhuǎn)義符來表示反斜杠本身或者使用自然字符串。例如,使用'C:\Documents'或r'C:\Documents'而不是'C:\Documents'——你在使用一個不知名的轉(zhuǎn)義符\D!
現(xiàn)在我們已經(jīng)有了一個可以工作的備份腳本,我們可以在任何我們想要建立文件備份的時候使用它。建議 Linux/Unix 用戶使用前面介紹的可執(zhí)行的方法,這樣就可以在任何地方任何時候運(yùn)行備份腳本了。這被稱為軟件的實(shí)施環(huán)節(jié)或開發(fā)環(huán)節(jié)。
上面的程序可以正確工作,但是(通常)第一個程序并不是與你所期望的完全一樣。例如,可能有些問題你沒有設(shè)計恰當(dāng),又或者你在輸入代碼的時候發(fā)生了一點(diǎn)錯誤,等等。正常情況下,你應(yīng)該回到設(shè)計環(huán)節(jié)或者調(diào)試程序。