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解析xml模块封装代码
Feb 07 Python
python快速查找算法应用实例
Sep 26 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
python实现自动发送报警监控邮件
Jun 21 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
Django Rest framework频率原理与限制
Jul 26 Python
python进行参数传递的方法
May 12 Python
python爬虫容易学吗
Jun 02 Python
python asyncio 协程库的使用
Jan 21 Python
python定义具名元组实例操作
Feb 28 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
Prototype框架详解
2015/11/25 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
python创建线程示例
2014/05/06 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
医药大学生求职简历的自我评价
2013/10/17 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
顶岗实习协议书
2015/01/29 职场文书
法定授权委托证明书
2015/06/18 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
详解nginx location指令
2022/01/18 Servers
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android