由于备份的需要,需要经常备份一些重要的文件,但是又不能逐个比较,所以就度了一下,找到了这篇博文,在此表示感谢,下面是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)