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类属性的延迟计算
Oct 22 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 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 进度条实现代码
2009/03/10 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
可输入的下拉框
2006/06/19 Javascript
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Django中的forms组件实例详解
2018/11/08 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
Python2与Python3的区别详解
2020/02/09 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
思想作风整顿个人剖析材料
2014/10/06 职场文书
公司承诺函范文
2015/01/21 职场文书
优秀英文求职信范文
2015/03/19 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫