python 实现目录复制的三种小结


Posted in Python onDecember 04, 2019

复制目录: 包含多层子目录

方法: 递归, 深度遍历,广度遍历

深度遍历&广度遍历:

思路:

1.获得源目录子级目录,并设置目标目录的子级路径

1.1在此就创建两个栈(或者队列),将原目录和目标目录分别添加到栈(或者队列)里面,一般用append添加,加在栈的顶部,队列的后部

1.2深度遍历 从栈的顶部取出一个原路径去判断,同时用同样的方式取出目标路径(栈和队列都类似于list,都可以用list实现)

广度遍历 从队列的前面取出一个原路径去判断,同时用同样的方式取出目标路径

2.判断原子级路径是否是文件

2.1如果目标子级文件不存在 或者目标子级文件存在,但是子级大小不一致,则复制

3.判断原子级目录是否是目录

3.1.递归 调用自己,把自己的子级目录当作源文件,复制到目标子级目录

3.2.深度遍历 广度遍历 都将原目录和目标目录添加(append)到栈(队列)的后面'''

# 深度遍历 广度遍历(仅取出来的方式不一样)
# 导入模块
import os, collections
 
def copyDir(sourcePath,targetPath):
  # 传入原目录,和需要复制后的目标目录
  # 判断需要复制的目录是否存在,如果不存在就返回
  if not os.path.isdir(sourcePath):
    return '源目录不存在'
  # 创建两个栈,一个用来存放原目录路径,另一个用来存放需要复制的目标目录
  sourceStack = collections.deque()
  sourceStack.append(sourcePath)
 
  targetStack = collections.deque()
  targetStack.append(targetPath)
  # 创建一个循环当栈里面位空时结束循环
  while True:
    if len(sourceStack) == 0:
      break
    # 将路径从栈的上部取出
    sourcePath = sourceStack.pop() #sourcePath = sourceStack.popleft()
    # 遍历出该目录下的所有文件和目录
    listName = os.listdir(sourcePath)
 
    # 将目录路径取出来
    targetPath = targetStack.pop() #targetPath = targetStack.popleft()
    # 判断该目标目录是否存在,如果不存在就创建
    if not os.path.isdir(targetPath):
      os.makedirs(targetPath)
    # 遍历目录下所有文件组成的列表,判断是文件,还是目录
    for name in listName:
      # 拼接新的路径
      sourceAbs = os.path.join(sourcePath, name)
      targetAbs = os.path.join(targetPath, name)
      # 判断是否时目录
      if os.path.isdir(sourceAbs):
        # 判断目标路径是否存在,如果不存在就创建一个
        if not os.path.exists(targetAbs):
          os.makedirs(targetAbs)
        # 将新的目录添加到栈的顶部
        sourceStack.append(sourceAbs)
        targetStack.append(targetAbs)
      # 判断是否是文件
      if os.path.isfile(sourceAbs):
        # 1.如果目标子级文件不存在 或者目标子级文件存在但是该文件与原子级文件大小不一致 则需要复制
        if (not os.path.exists(targetAbs)) or (os.path.exists(targetAbs) and os.path.getsize(targetAbs) != os.path.getsize(targetAbs)):
          rf = open(sourceAbs, mode='rb')
          wf = open(targetAbs, mode='wb')
          while True:
            # 一点一点读取,防止当文件较大时候内存吃不消
            content = rf.read(1024*1024*10)
            if len(content) == 0:
              break
            wf.write(content)
            # 写入缓冲区时候手动刷新一下,可能会加快写入
            wf.flush()
          # 读写完成关闭文件
          rf.close()
          wf.close()
# 传入需要复制的目录和需要复制到的目标目录
sPath = ""
tPath = ""
copyDir(sPath,tPath)

递归遍历:

递归思路:

1.定义一个函数来复制目录,需要传入原目录和目标目录

2.判断源目录是否是一个目录--不是就终止

3.判断目标目录是否存在--不存在,新建

4.遍历源目录,

import os
 
 
def copyDir(sourceDir,targetDir):
 
  if not os.path.isdir(sourceDir):
 
    return "源目录不存在"
 
  if not os.path.exists(targetDir):
 
    os.makedirs(targetDir)
 
  listName = os.listdir(sourceDir)
 
  for name in listName:
 
    sourceAbs = os.path.join(sourceDir,name)
 
    targetAbs = os.path.join(targetDir,name)
 
  if os.path.isdir(sourceAbs):
 
    #创建目标目录
 
    if not os.path.exists(targetAbs):
 
      os.makedirs(targetAbs)
 
    copyDir(sourceAbs,targetAbs)
 
  if os.path.isfile(sourceAbs):
 
  # 1.如果目标子级文件不存在 或者 目标子级文件存在但是该文件与原子级文件大小不一致 则需要复制
 
    if (not os.path.exists(targetAbs)) or (os.path.exists(targetAbs) and os.path.getsize(targetAbs) != os.path.getsize(sourceAbs)):
 
      rf = open(sourceAbs,mode="rb")
 
      wf = open(targetAbs,mode="wb")
 
      while True:
 
        content = rf.read(1024*1024*10)
 
        if len(content) == 0:
 
          break
 
        wf.write(content)
 
        wf.flush()
 
        rf.close()
 
        wf.close()
 
# 测试
 
sPath = ""
 
tPath = ""
 
copyDir(sPath,tPath)

以上这篇python 实现目录复制的三种小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 采集中文乱码问题的完美解决方法
Sep 27 Python
使用python实现个性化词云的方法
Jun 16 Python
flask-restful使用总结
Dec 04 Python
Django给admin添加Action的步骤详解
May 01 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python爬虫中多线程的使用详解
Sep 23 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
python小项目之五子棋游戏
Dec 26 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Python使用Numpy模块读取文件并绘制图片
May 13 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
python求绝对值的三种方法小结
Dec 04 #Python
解决Python3下map函数的显示问题
Dec 04 #Python
Django3.0 异步通信初体验(小结)
Dec 04 #Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 #Python
Python绘图实现显示中文
Dec 04 #Python
Python图片的横坐标汉字实例
Dec 04 #Python
使用Pandas的Series方法绘制图像教程
Dec 04 #Python
You might like
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP里的单例类写法实例
2015/06/25 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
处理Python中的URLError异常的方法
2015/04/30 Python
Python实用日期时间处理方法汇总
2015/05/09 Python
Python装饰器基础详解
2016/03/09 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
Python自动抢红包教程详解
2019/06/11 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
Django更新models数据库结构步骤
2020/04/01 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
全民健身日活动方案
2014/01/29 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
岗位安全生产责任书
2014/07/28 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书