1. 程式人生 > >編寫第一個python 指令碼(重要檔案建立備份)

編寫第一個python 指令碼(重要檔案建立備份)

程式設計思路:

  1. 需要備份的檔案和目錄由一個列表指定。

  2. 備份應該儲存在主備份目錄中。

  3. 檔案備份成一個zip檔案。

  4. zip存檔的名稱是當前的日期和時間。

  5. 我們使用標準的zip命令,它通常預設地隨Linux/Unix發行版提供。Windows使用者可以使用Info-Zip程式。注意你可以使用任何地存檔命令,只要它有命令列介面就可以了,那樣的話我們可

版本一

#!/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'

輸出

$ python backup_ver1.py
Successful backup to /mnt/e/backup/20041208073244.zip

現在,我們已經處於測試環節了,在這個環節,我們測試我們的程式是否正確工作。如果它與我們所期望的不一樣,我們就得除錯我們的程式,即消除程式中的 瑕疵 (錯誤)。

它如何工作

接下來你將看到我們如何把 設計 一步一步地轉換為 程式碼

我們使用了ostime模組,所以我們輸入它們。然後,我們在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使用者使用前面介紹的可執行的方法,這樣就可以在任何地方任何時候執行備份指令碼了。這被稱為軟體的實施環節或開發環節。

上面的程式可以正確工作,但是(通常)第一個程式並不是與你所期望的完全一樣。例如,可能有些問題你沒有設計恰當,又或者你在輸入程式碼的時候發生了一點錯誤,等等。正常情況下,你應該回到設計環節或者除錯程式。

版本二

第一個版本的指令碼可以工作。然而,我們可以對它做些優化以便讓它在我們的日常工作中變得更好。這稱為軟體的維護環節。

我認為優化之一是採用更好的檔名機制——使用 時間 作為檔名,而當前的 日期 作為目錄名,存放在主備份目錄中。這樣做的一個優勢是你的備份會以等級結構儲存,因此它就更加容易管理了。另外一個優勢是檔名的長度也可以變短。還有一個優勢是採用各自獨立的資料夾可以幫助你方便地檢驗你是否在每一天建立了備份,因為只有在你建立了備份,才會出現那天的目錄。

#!/usr/bin/python
# Filename: backup_ver2.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 current day is the name of the subdirectory in the 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 subdirectory if it isn't already there
if not os.path.exists(today):
    os.mkdir(today) # make directory
    print 'Successfully created directory', today

# The name of the zip file
target = today + os.sep + now + '.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'

輸出

$ python backup_ver2.py
Successfully created directory /mnt/e/backup/20041208
Successful backup to /mnt/e/backup/20041208/080020.zip

$ python backup_ver2.py
Successful backup to /mnt/e/backup/20041208/080428.zip

它如何工作

兩個程式的大部分是相同的。改變的部分主要是使用os.exists函式檢驗在主備份目錄中是否有以當前日期作為名稱的目錄。如果沒有,我們使用os.mkdir函式建立。

注意os.sep變數的用法——這會根據你的作業系統給出目錄分隔符,即在Linux、Unix下它是'/',在Windows下它是'\\',而在Mac OS下它是':'。使用os.sep而非直接使用字元,會使我們的程式具有移植性,可以在上述這些系統下工作。

版本三

第二個版本在我做較多備份的時候還工作得不錯,但是如果有極多備份的時候,我發現要區分每個備份是幹什麼的,會變得十分困難!例如,我可能對程式或者演講稿做了一些重要的改變,於是我想要把這些改變與zip歸檔的名稱聯絡起來。這可以通過在zip歸檔名上附帶一個使用者提供的註釋來方便地實現。

#!/usr/bin/python
# Filename: backup_ver3.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 current day is the name of the subdirectory in the 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: # check if a comment was entered
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' +
        comment.replace(' ', '_') + '.zip'

# Create the subdirectory if it isn't already there
if not os.path.exists(today):
    os.mkdir(today) # make directory
    print 'Successfully created directory', today

# 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'

輸出

$ python backup_ver3.py
File "backup_ver3.py", line 25
target = today + os.sep + now + '_' +
                                ^
SyntaxError: invalid syntax

它如何(不)工作

這個程式不工作!Python說有一個語法錯誤,這意味著指令碼不滿足Python可以識別的結構。當我們觀察Python給出的錯誤的時候,它也告訴了我們它檢測出錯誤的位置。所以我們從那行開始 除錯 我們的程式。

通過仔細的觀察,我們發現一個邏輯行被分成了兩個物理行,但是我們並沒有指明這兩個物理行屬於同一邏輯行。基本上,Python發現加法操作符(+)在那一邏輯行沒有任何運算元,因此它不知道該如何繼續。記住我們可以使用物理行尾的反斜槓來表示邏輯行在下一物理行繼續。所以,我們修正了程式。這被稱為修訂

版本四

#!/usr/bin/python
# Filename: backup_ver4.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 current day is the name of the subdirectory in the 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: # check if a comment was entered
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + \
        comment.replace(' ', '_') + '.zip'
    # Notice the backslash!

# Create the subdirectory if it isn't already there
if not os.path.exists(today):
    os.mkdir(today) # make directory
    print 'Successfully created directory', today

# 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'

輸出

$ python backup_ver4.py
Enter a comment --> added new examples
Successful backup to /mnt/e/backup/20041208/082156_added_new_examples.zip

$ python backup_ver4.py
Enter a comment -->
Successful backup to /mnt/e/backup/20041208/082316.zip

它如何工作

這個程式現在工作了!讓我們看一下版本三中作出的實質性改進。我們使用raw_input函式得到使用者的註釋,然後通過len函式找出輸入的長度以檢驗使用者是否確實輸入了什麼東西。如果使用者只是按了回車(比如這只是一個慣例備份,沒有做什麼特別的修改),那麼我們就如之前那樣繼續操作。

然而,如果提供了註釋,那麼它會被附加到zip歸檔名,就在.zip副檔名之前。注意我們把註釋中的空格替換成下劃線——這是因為處理這樣的檔名要容易得多。

進一步優化

對於大多數使用者來說,第四個版本是一個滿意的工作指令碼了,但是它仍然有進一步改進的空間。比如,你可以在程式中包含 互動 程度——你可以用-v選項來使你的程式更具互動性。

另一個可能的改進是使檔案和目錄能夠通過命令列直接傳遞給指令碼。我們可以通過sys.argv列表來獲取它們,然後我們可以使用list類提供的extend方法把它們加到source列表中去。

我還希望有的一個優化是使用tar命令替代zip命令。這樣做的一個優勢是在你結合使用targzip命令的時候,備份會更快更小。如果你想要在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表示含在指定檔名列表中的檔案會被排除在備份之外。例如,你可以在檔案中指定*~,從而不讓備份包括所有以~結尾的檔案。

重要
最理想的建立這些歸檔的方法是分別使用zipfiletarfile。它們是Python標準庫的一部分,可以供你使用。使用這些庫就避免了使用os.system這個不推薦使用的函式,它容易引發嚴重的錯誤。
然而,我在本節中使用os.system的方法來建立備份,這純粹是為了教學的需要。這樣的話,例子就可以簡單到讓每個人都能夠理解,同時也已經足夠用了。


相關推薦

編寫一個python 指令碼重要檔案建立備份

程式設計思路: 需要備份的檔案和目錄由一個列表指定。 備份應該儲存在主備份目錄中。 檔案備份成一個zip檔案。 zip存檔的名稱是當前的日期和時間。 我們使用標準的zip命令,它通常預設地隨Linux/Unix發行版提供。Windows使用者可以使用Info-Z

編寫一個shell指令碼檔案

vi test.sh 這樣就新建了一個名為test.sh的指令碼檔案,之後按i進入編輯模式,輸入以下內容: echo "What is your name?" read PERSON echo "Hello, $PERSON" 按esc鍵退出編輯模式,再輸

如何成為python聖鬥士之一個python程序1

python 小白 聖鬥士 安裝python解釋器python是跨平臺的語言,目前主流的有2.X和3.X系列版本,由於3.X系列是不兼容2.X系列的,但現如今很多程序和第三方庫都是基於2.X系列開發的,因此我們以2.X為主,期間也會穿插介紹3.X的部分特性。學習編程語言的第一步那就是hellowo

第二天---介紹Python編譯器,pycharm設置以及編寫一個Python程序

python學習記錄介紹Python編譯器1.linux下:一般使用vi或者vim直接編譯以.py為後綴的文件,使用vi需要自己搜索vim python 自動補全以方便我們編寫。2.windos下:(1)使用submit選擇Python類型進行編譯,但是對於初學者submit需要安裝許多插件,很麻煩。這些後面

一個python程序2

小結 nts 技術 數學公式 spa 但是 漂亮 num 回車 輸入和輸出 輸出 用print加上字符串,就可以向屏幕上輸出指定的文字。比如輸出‘hello, world‘,用代碼實現如下: >>> print ‘hello, world‘ print語

使用Pycharm編寫一個python程序

int 解釋 image ado 保存 f2c run 51cto 顯示 使用Pycharm編寫第一個python程序打開 Pycharm,選擇 Create New Project,創建一個新項目 選擇Pure Python表示創建一個純Python程序項目, Locat

編寫一個Shell指令碼【TLCL】

怎樣編寫一個 Shell 指令碼 編寫一個指令碼 使指令碼檔案可執行 把指令碼放到Shell能夠找到的地方 指令碼檔案格式 #!/bin/bash # This is our first script. echo 'Hello World!' #

hadoop2.7一個python例項超詳細

沒有任何基礎,第一次跑hadoop例項,遇到不少問題,記錄下來以便自查和幫助同樣情況的hadoop學習者。 叢集組成:VMwawre14.1+CentOS6.5+hadoop2.7,  3個虛擬機器節點 hadoop安裝目錄:/opt/hadoop 例子:模仿 Wo

編寫一個maven外掛含完整專案

基本上快把maven實戰這本書看完了,對裡面的知識點不敢說全懂,但至少懂了個百分之六七十,不過大部分概念還是清楚地, 剩下的就需要實際的碼程式碼中去學習了。 迴歸正題,編寫一個maven外掛: 第一步: 建立一個maven專案,可以用命令列的方式建立如:mvn archet

使用PyQt來編寫一個Python GUI程式

這段程式碼有什麼用?還記得我們把按鈕命名為了calc_tax_button 嗎?(這是這個按鈕物件的名字,不是按鈕上顯示的提示字串。)clicked 是一個內建的函式,當有按鈕被點選的時候它會被自動呼叫(很神奇吧)。所有的 QT 元件都有特定的函式,你可以通過 Google 來檢視詳細。這段程式碼的最後部

我的一個Python程式簡單的使用者名稱密碼登入程式

話說啊,所謂的C語言1000行,Java100行,Python20行呢。。。光一個登入就30行了。、  一個輸入使用者名稱密碼的登入程式: init_usrname=input('Please en

Java呼叫Python指令碼Python3,Windows10系統

介紹下如何在Java中呼叫Python指令碼,可能是目前最簡單的方法(●’^'●)。 又是師姐的任務,要求把我的Python程式整合到純Java的系統中。於是在網上又是一頓搜尋,不乏各種厲害的方法。其中最常見的是Jython,聽起來十分高大上,直接把世界上

Java呼叫Python指令碼不需要傳參

     具體步驟:1)Run-Run Configurations...-Environment-New,Name設定為:PATH,Value設定為:python的安裝路 徑,例如:D:\Program\python27

c#在excel裡批量插入附件檔案建立物件

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; u

python學習總結一個python程序的編寫

程序代碼 spa 編碼 結構 編輯 下載地址 utf 修改編碼 general 1. python是一種解釋性,編譯型,互動型的語言,面向對象,動態數據類型的高級程序設計語言。 1.1 交互式:意味著可以在一個提示符直接交互執行你寫的程序。 1.2 解釋型:意味著開發過程中

我的一個python web開發框架2——一個簡單的小外包

span 技術 進行 target 最好 自己 blog height 描述   第一部分說明   第一部分大概有20來章,主要講的是一些開發常識、開發前中後期準備內容、開發環境與服務器部署環境安裝設置、python基礎框架結構與功能等內容,代碼會比較簡單。   

我的一個python web開發框架4——數據庫結構設計與創建

數據結構 描述 分析器 設置 一個 由於 logs 記錄 開發框架   小白做好前端html設計後,馬上開始進入數據庫結構設計步驟。      在開始之前,小白回憶了一下老大在公司裏培訓時講過的數據庫設計解說:   對於初學者來說,很多拿到原型時不知道怎麽設計數據表結

我的一個python web開發框架5——開發前準備工作了解編碼前需要知道的一些常識

turn 框架 strong pep8 加密與解密 python開發 lan 二次 沒有   中午吃飯時間到了,小白趕緊向老菜坐的位置走過去。   小白:老大,中午請你吃飯。   老菜:哈哈...又遇到問題了吧,這次得狠狠宰你一頓才行。   小白:行行行,只要您賞臉,

我的一個python web開發框架15——公司介紹編輯功能

getcwd 轉義 導航菜單 unicode 存儲路徑 -c 序號 管理 bsp   完成登錄以後,就會進入後臺管理系統的主界面,因為這個是小項目,所以導航菜單全部固化在HTML中,不能修改。一般後臺還會有一個歡迎頁或關鍵數據展示的主頁面,小項目也沒有多大的必要,所以登錄後

我的一個python web開發框架16——產品分類管理

計算 添加按鈕 _for records 操作 qq群 api 回復 derby   產品分類管理的html頁面之前忘記做了,這次附件裏補上。   好了先上圖      從頁面效果圖來看,我們需要開發列表獲取接口、添加接口、單條記錄獲取接口、編輯接口和刪除接口