由於備份的需要,需要經常備份一些重要的文件,但是又不能逐個比較,所以就度了一下,找到了這篇博文,在此表示感謝,下面是python3版的寫法,其中有一些改變,重要的改變之處作出了簡要注釋,完整注釋請參考原文,
重要:下面代碼未經充分測試,在備份自己文件之前,請充分測試,如有疏漏之處,歡迎留言,一起學習
注意:注意路徑的分割斜杠,在這里是斜杠/而非反斜杠\
md5校驗選擇備份
1 # -*- coding: utf-8 -*- 2 3 4 import hashlib 5 import os 6 import shutil 7 8 9 def md5check(fname): 10 m = hashlib.md5() 11 with open(fname, 'rb') as f: # 這里文件的打開方式與原文不同,由於在備份我的文件時出現了編碼問題,所以進行了修改,以二進制方式打開 12 while True: 13 data = f.read(4096) 14 if not data: 15 break 16 m.update(data) 17 return m.hexdigest() 18 19 20 21 22 # 文件復制函數 23 def copy(path): 24 new_path = path 25 new_path = new_path.replace(old_source, new_source) 26 print(new_path) 27 if os.path.isfile(new_path): 28 old_md5 = md5check(path) 29 new_md5 = md5check(new_path) 30 if old_md5 != new_md5: 31 shutil.copy(path, new_path) 32 else: 33 dirname = os.path.dirname(new_path) 34 if os.path.exists(dirname): # 如果目錄存在,直接復制文件到new_path 35 shutil.copy(path, new_path) 36 else: # 如果目錄不存在,則直接創建目錄並復制文件 37 try: 38 os.makedirs(dirname) 39 shutil.copy(path, new_path) 40 except WindowsError: 41 print('創建目錄出錯') 42 43 # 查找所有目錄文件的遞歸函數 44 def lsdir(folders): 45 path = os.listdir(folders) 46 for line in path: 47 line = folders + '/' + line 48 if(os.path.isdir(line)): 49 lsdir(line) 50 else: 51 copy(line) 52 53 54 55 56 57 58 59 if __name__ == '__main__': 60 global old_source 61 global new_source 62 print('例子:d:/directory,請輸入要備份的目錄所在地址、以及目標地址:') 63 old_source = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb' 64 new_source = 'D:/leveldb' # 此處不知道只傳入盤符會發生什么,建議不要這么做,未經測試 65 lsdir(old_source) 66
完全備份
# -*- coding: utf-8 -*- # 腳本功能:刪除new_path目錄,然后復制original_path到new_path目錄,注意兩目錄的名稱要一樣,初衷:用於名稱變化的需要備份的文件 # 基於python3 import os import shutil # 不校驗直接刪除已備份文件,再重新備份源文件 def non_checkout_backup(original_path, new_path): if os.path.exists(new_path): shutil.rmtree(new_path) # shutil.rmtree空目錄、有內容的目錄都可以刪,但是必須要存在,否則報錯, 而os.rmdir只能刪除空目錄 shutil.copytree(original_path, new_path) # original_path、new_path都只能是目錄 if __name__ == '__main__': original_path = 'C:/Users/xxxx/AppData/Local/Google/Chrome/User Data/Default/Local Storage/leveldb' new_path = 'D:/leveldb' non_checkout_backup(original_path, new_path)
