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下线程之间的共享和释放示例
May 04 Python
python实现简易版计算器
Jun 22 Python
PyQt5每天必学之单行文本框
Apr 19 Python
对python3 urllib包与http包的使用详解
May 10 Python
Python3.7中安装openCV库的方法
Jul 11 Python
python实现flappy bird游戏
Dec 24 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
python实现简单学生信息管理系统
Apr 09 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
解决pytorch读取自制数据集出现过的问题
May 31 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
PHP的PSR规范中文版
2013/09/28 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
详谈PHP编码转换问题
2015/07/28 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Python定时任务sched模块用法示例
2018/07/16 Python
python实现从wind导入数据
2019/12/03 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
建筑设计师岗位职责
2013/11/18 职场文书
水务局局长岗位职责
2013/11/28 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
2014年电话销售工作总结
2014/12/01 职场文书