1. 程式人生 > >使用Python編寫的檔案備份程式

使用Python編寫的檔案備份程式

作為程式設計師平時需要備份許多東西,生怕有些檔案改了就找不回來了,尤其是U盤裡的經常會被修改,而我又不能一個檔案一個檔案的對比著去備份,全複製又太浪費時間,網上關於備份的程式很多,但有很多限制,沒有我想要的功能,而且有的還會收費,所以決定自己來造個輪子。

平時用PHP比較多,我也有想過用PHP寫一個類似的檔案遊覽器,但這個輪子就造的有些大了,我只是想自動備份U盤裡的東西,能夠自動對比匹配目標檔案就可以,不需要太臃腫,而Python簡單,快速,連介面都不用寫,每次直接執行就行。所以我決定使用Python來編寫,原理就是對備份目錄進行遞迴,把找到的檔案和本地的檔案進行對比,對比時使用檔案生成md5碼來匹配,如果本地不存在,則建立目錄,再複製檔案。如果沒有Python環境,可以直接下載我編譯好的.exe程式直接使用,輸入時要注意,由於沒有寫圖形介面,資料夾的地址需要輸入,一定要保證檔案地址的正確,如果是主碟符如d盤,直接寫’d:’,\n如果是資料夾,例如d盤下的test資料夾,則輸入d:/test。下面是原始碼,註釋寫的非常詳細,需要的可以按照自己的需求更改。

#-*- coding=utf8 -*-
#使用函式對指定目錄進行深層次遍歷,先列出來所有的檔案和目錄
#再去指定的目錄裡再次查詢檔案和目錄,一直深入下去
# 如果是檔案,就不再深入下去,而去判斷路徑是否存在於電腦中,
# 不存在則將其複製
import hashlib
import os
import shutil
#用於判斷兩個檔案是否相同,提取每個檔案中的前4位元組的內容然後輸出md5碼進行比較
def md5check(fname):
    m = hashlib.md5()
    with open(fname) as fobj:
        while True:
            data = fobj.read(4096
) if not data: break m.update(data) return m.hexdigest() #檔案複製的函式 def copy(path): new_path = path new_path = new_path.replace(old_scoure, new_scoure) #將原碟符替換為我所要存放的目標碟符 print path + "---copy---" + new_path if os.path.isfile(new_path): #如果目標檔案存在
old_md = md5check(path) #提取原始檔的md5 new_md = md5check(new_path) #提取目標檔案的md5 if old_md != new_md: #如果不相等,說明原始檔有修改 shutil.copy(path, new_path) #因為已經判斷了目標檔案的存在,所以不需要建立目錄,直接複製就可以 else: #如果目標檔案不存在 dirname = os.path.dirname(new_path) # 提取目標的目錄 if os.path.exists(dirname): #目錄存在 shutil.copy(path, new_path) #直接複製檔案 else: #目錄不存在 try: os.makedirs(dirname) #使用多級目錄建立函式建立目錄 shutil.copy(path, new_path) #直接複製檔案 except WindowsError: #錯誤反饋,而不會停止操作 print "建立目錄出錯" # 查詢所有目錄檔案的遞迴函式 def lsdir(forder): path = os.listdir(forder) #分離出來的檔案列表 # print forder # print path for line in path: #逐個判斷 line = forder + "/" + line #沒有使用join函式,因為會出現 \ if (os.path.isdir(line)): #是目錄就繼續進行遞迴 lsdir(line) else: # path = os.path.join(forder,line) # print 'l:'+line copy(line) #將檔案的地址傳到copy函式中去複製 # break def test(): print new_scoure if __name__=='__main__': # lsdir('e:/test') global old_scoure global new_scoure #設定為全域性變數 concent = "請保證地址的正確性,如果是主碟符如d盤,直接寫'd:',\n如果是資料夾,例如d盤下的test資料夾,則輸入d:/test" c_unicode = concent.decode("utf-8") #為了在cmd顯示中文,需要進行轉碼 # c_gbk = c_unicode.encode("gbk") print c_unicode concent = "輸入要備份的檔案地址:" c_unicode = concent.decode("utf-8") print c_unicode old_scoure = raw_input() concent = "輸入備份檔案要存放的地址,請保證地址存在:" c_unicode = concent.decode("utf-8") print c_unicode new_scoure = raw_input() # path = 'e:/Markdown' lsdir(old_scoure) concent = "輸入任意鍵關閉" c_unicode = concent.decode("utf-8") print c_unicode raw_input()

下面是執行的效果圖片