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

来自CloudWiki
跳转至: 导航搜索
(创建页面,内容为“===比较左右两侧文件=== <nowiki>import filecmp import shutil import os left = r"D:\teaching\人工智能" # 定义左目录 right = r"E:\20200311\teaching\…”)
 
 
(未显示4个用户的28个中间版本)
第1行: 第1行:
 +
==基础操作==
 
===比较左右两侧文件===
 
===比较左右两侧文件===
 
  <nowiki>import filecmp
 
  <nowiki>import filecmp
import shutil
+
 
 
import os
 
import os
 
left = r"D:\teaching\人工智能" # 定义左目录
 
left = r"D:\teaching\人工智能" # 定义左目录
第18行: 第19行:
  
 
  <nowiki>
 
  <nowiki>
 +
import shutil
 
for i in dirobj.left_only:
 
for i in dirobj.left_only:
 
     left_file=os.path.realpath(i)
 
     left_file=os.path.realpath(i)
第33行: 第35行:
  
 
  <nowiki>
 
  <nowiki>
from os import listdir
 
 
from os.path import join, isfile, isdir
 
from os.path import join, isfile, isdir
  
第53行: 第54行:
 
                 print(path)
 
                 print(path)
 
                 dirs.append(path)
 
                 dirs.append(path)
listDirWidthFirst('.')</nowiki>
+
               
 +
listDirWidthFirst(r'D:\Game')</nowiki>
 +
 
 +
===深度优先遍历目录===
 +
===复制云端目录(选做)===
 +
<nowiki>
 +
from os import listdir,makedirs
 +
from os.path import join, isfile, isdir
 +
 
 +
dirs= []
 +
dirs_right =[]  #云端的目录集合
 +
dirs_left = []  #本地端的目录集合
 +
 
 +
def GetDirWidthFirst(root_right):#root_right:云端根目录
 +
    '''广度优先遍历,得到云端目录集合'''
 +
    #使用列表模拟双端队列,效率稍微受影响,不过关系不大
 +
    global dirs,dirs_right
 +
    dirs = [root_right] #dirs:用做广度优先遍历的列表,这个root_right就是列表的第一个元素
 +
    dirs_right = [root_right]
 +
    #如果还有没遍历过的文件夹,继续循环
 +
   
 +
    while dirs:
 +
        #遍历还没遍历过的第一项
 +
        current = dirs.pop(0)
 +
        #遍历该文件夹,如果是文件就直接输出显示
 +
        #如果是文件夹,输出显示后,标记为待遍历项
 +
        for subPath in listdir(current):
 +
            #print(subPath)           
 +
            path = join(current,subPath)
 +
            #print(path)
 +
            #os.path.split(path)
 +
            #('D:\\teaching\\自动化运维\\练习', '7.1.py')
 +
            #current.split("teaching\\")
 +
            a,b=current.split("teaching\\")
 +
            #print(a,b)           
 +
            if isdir(path):
 +
                #print(path)
 +
                dirs.append(path)
 +
                dirs_right.append(path)
 +
 
 +
def CreateDirLocal(root_left,root_right):
 +
    '''创建本地目录'''
 +
    global dirs,dirs_right,dirs_left
 +
 
 +
    #生成本地目录名
 +
    for d in dirs_right:   
 +
        #print(d)
 +
        new_dir =d.replace(root_right,root_left)
 +
        dirs_left.append(new_dir)
 +
       
 +
    total,new=0,0   
 +
    for d in dirs_left:   
 +
        #print(d)
 +
        total+=1
 +
        if not isdir(d):
 +
            print(d,"不存在")
 +
            makedirs(d)
 +
            new+=1
 +
    print("total=",total,"new=",new)
 +
   
 +
root_right=r'E:\20200311\teaching\自动化运维'     
 +
root_left=r'D:\teaching\自动化运维'         
 +
GetDirWidthFirst(root_right)
 +
CreateDirLocal(root_left,root_right)
 +
</nowiki>
 +
 
 +
==应用实战==
 +
===增量备份===
 +
本程序用于将文件增量备份到云端:
 +
 
 +
<nowiki>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)</nowiki>

2020年6月19日 (五) 10:41的最新版本

基础操作

比较左右两侧文件

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)

广度优先遍历目录

from os.path import join, isfile, isdir

def listDirWidthFirst(directory):
    '''广度优先遍历文件夹'''
    #使用列表模拟双端队列,效率稍微受影响,不过关系不大
    dirs = [directory]#这个directory就是列表的第一个元素
    #如果还有没遍历过的文件夹,继续循环
    while dirs:
        #遍历还没遍历过的第一项
        current = dirs.pop(0)
        #遍历该文件夹,如果是文件就直接输出显示
        #如果是文件夹,输出显示后,标记为待遍历项
        for subPath in listdir(current):
            path = join(current, subPath)
            if isfile(path):
                print(path)
            elif isdir(path):
                print(path)
                dirs.append(path)
                
listDirWidthFirst(r'D:\Game')

深度优先遍历目录

复制云端目录(选做)

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

dirs= []
dirs_right =[]  #云端的目录集合
dirs_left = []  #本地端的目录集合

def GetDirWidthFirst(root_right):#root_right:云端根目录
    '''广度优先遍历,得到云端目录集合'''
    #使用列表模拟双端队列,效率稍微受影响,不过关系不大
    global dirs,dirs_right
    dirs = [root_right] #dirs:用做广度优先遍历的列表,这个root_right就是列表的第一个元素
    dirs_right = [root_right]
    #如果还有没遍历过的文件夹,继续循环
    
    while dirs:
        #遍历还没遍历过的第一项
        current = dirs.pop(0)
        #遍历该文件夹,如果是文件就直接输出显示
        #如果是文件夹,输出显示后,标记为待遍历项
        for subPath in listdir(current):
            #print(subPath)            
            path = join(current,subPath)
            #print(path)
            #os.path.split(path)
            #('D:\\teaching\\自动化运维\\练习', '7.1.py')
            #current.split("teaching\\")
            a,b=current.split("teaching\\")
            #print(a,b)            
            if isdir(path):
                #print(path)
                dirs.append(path)
                dirs_right.append(path)

def CreateDirLocal(root_left,root_right):
    '''创建本地目录'''
    global dirs,dirs_right,dirs_left

    #生成本地目录名
    for d in dirs_right:    
        #print(d)
        new_dir =d.replace(root_right,root_left)
        dirs_left.append(new_dir)
        
    total,new=0,0    
    for d in dirs_left:    
        #print(d)
        total+=1
        if not isdir(d):
            print(d,"不存在")
            makedirs(d)
            new+=1
    print("total=",total,"new=",new)
    
root_right=r'E:\20200311\teaching\自动化运维'      
root_left=r'D:\teaching\自动化运维'          
GetDirWidthFirst(root_right)
CreateDirLocal(root_left,root_right)

应用实战

增量备份

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

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)