差异备份以及文件同步:
import os import filecmp import shutil import re # 差异增量更新,dir2 文件目录 与 dir1 文件目录更新, def a(dir1,dir2): cc = [] d1 = os.path.abspath(dir1) d2 = os.path.abspath(dir2) a1 = filecmp.dircmp(d1,d2) cc += a1.diff_files + a1.left_only # print("差异列表:",cc) if cc: for i3 in cc: # print(os.path.join(d1,i3)) if os.path.isfile(os.path.join(d1,i3)): shutil.copy2(os.path.join(d1,i3),d2) else: os.makedirs(os.path.join(d2,i3)) a(os.path.join(d1,i3),os.path.join(d2,i3)) else: a2 = a1.left_list for i in a2: if os.path.isdir(os.path.join(d1,i)): a(os.path.join(d1,i), os.path.join(d2,i)) # dir2 文件目录与 dir1 文件目录同步,删除dir2 多余的文件以及目录 def b(dir2,dir1): def cc(dir): t = [] redir = "(%s)" % r'\'.join(dir.split("\")) for i in os.walk(dir): # print(i) if i[2] == []: continue if len(i[2]) > 1: for i2 in i[2]: t.append(os.path.join(re.sub(redir, '', i[0]), i2)) else: t.append(os.path.join(re.sub(redir, '', i[0]), i[2][0])) return t # 所有源文件的绝对路径 t1 = cc(dir1) # 所有备份的文件的绝对路径 t2 = cc(dir2) # 备份文件与源文件同步,找出备份文件中有的,而源文件没有的. t3 = list(set(t2).difference(set(t1))) # 移除多余的文件 for i3 in t3: print(dir2,'---',i3) print('移除备份目录中多余的文件: %s'% ''.join(dir2+i3)) pa = ''.join(dir2+i3) os.remove(pa) # 递归去删除空的目录 def c(dir2): for i in os.walk(dir2): if len(i[2]) != 0:continue try: os.rmdir(i[0]) except OSError as e: for i2 in i[1]: c(os.path.join(i[0],i2)) # 主函数 def main(dir1,dir2): a(dir1,dir2) b(dir2,dir1) c(dir2) if __name__ == '__main__': dir1 = input("请输入源目录绝对路径:") dir2 = input("请输入备份目录绝对路径:") main(dir1,dir2)