“Python云存储备份”的版本间的差异

来自CloudWiki
跳转至: 导航搜索
广度优先遍历目录
广度优先遍历目录
第33行: 第33行:
  
 
===广度优先遍历目录===
 
===广度优先遍历目录===
<nowiki>
+
 
import os
+
 
 +
<nowiki>import os
 
from collections import deque#从收集模块中导入双端队列
 
from collections import deque#从收集模块中导入双端队列
 
class GuangDu:
 
class GuangDu:

2020年6月12日 (五) 02:22的版本

基础操作

比较左右两侧文件

import filecmp

import os
left = r"D:\teaching\人工智能" # 定义左目录

right = r"E:\20200311\teaching\人工智能" #定义右目录

#比较目录
dirobj = filecmp.dircmp(left, right, ['cmp.py']) #目录比较,忽略test.py文件
dirobj.report()

print("left_only:")
print(dirobj.left_only) # 只在左目录中的文件或目录

复制文件

import shutil
for i in dirobj.left_only:
    left_file=os.path.realpath(i)
    right_file=os.path.join(right,i)
    print("左侧发现新文件/目录: "+i)
    print(left_file)
    print(right_file)
    s=input("是否复制?y/n")
    if s=='y':
        print("开始复制中...")
        shutil.copyfile(left_file,right_file)
        print("复制完毕"+right_file)

广度优先遍历目录

import os from collections import deque#从收集模块中导入双端队列 class GuangDu: def __init__(self,path): "初始换函数,读取的根目录" self.path =path self.MyList =deque([])#实例化一个队列 self.MyList.append(self.path)#把根目录路径放入队列中 def BianLi(self): "广度遍历的方法实现" while len(self.MyList) !=0:#当队列中为空的时候跳出循环 path =self.MyList.popleft()#从队列中弹出一个路径 if os.path.isdir(path):#对弹出的path路径判断是否是一个文件夹 print("文件夹",path)#打印文件夹的路径 myFilePath =os.listdir(path)#如果是一个文件夹,就把文件夹里面的所有东西添加进列表中, for line in myFilePath:#对添加到列表中的东西进行遍历 myPath =path +"\\"+line#形成绝对路径, self.MyList.append(myPath)#把遍历的东西都加入到队列中 else:#如果不是一个文件夹,就直接把路径打印出来,不用对其进行遍历了 print("文件",path) def __del__(self): "最终会执行的函数" pass path =r"F:\广度遍历测试"#初始的文件目录 file =GuangDu(path)#实例化一个对象 file.BianLi()#对象调用方法

应用实战

增量备份

本程序用于将文件增量备份到云端:

from os import listdir,makedirs
from os.path import join, isfile, isdir
import os
import shutil,filecmp

def usage():
    print("目录路径不对 ~")  




def CopyToCloud(scrDir, dstDir):
    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir)) or
      (os.path.abspath(scrDir)!=scrDir) or (os.path.abspath(dstDir)!=dstDir)):
        usage()
        return
        
    for item in os.listdir(scrDir):
        scrItem = os.path.join(scrDir, item)
        dstItem = scrItem.replace(scrDir,dstDir)
        if os.path.isdir(scrItem):
            #创建新增的文件夹,保证目标文件夹的结构与原始文件夹一致
            if not os.path.exists(dstItem):
                os.makedirs(dstItem)
                print('make directory'+dstItem)
            #递归调用自身函数
            CopyToCloud(scrItem, dstItem)
        elif os.path.isfile(scrItem):
            #只复制新增或修改过的文件
            if ((not os.path.exists(dstItem)) or
               (not filecmp.cmp(scrItem, dstItem, shallow=False))):
                shutil.copyfile(scrItem, dstItem)
                print('file:'+scrItem+'==>'+dstItem)
    
    
    
    
root_right=r'E:\20200311'      
root_left='D:\\'

d=r"teaching\自动化运维"
left=join(root_left,d)
right=join(root_right,d)
print(left,right)
CopyToCloud(left,right)