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实现
Jan 28 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
python编写分类决策树的代码
Dec 21 Python
python 实现A*算法的示例代码
Aug 13 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
python正则-re的用法详解
Jul 28 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
Python基于execjs运行js过程解析
Nov 27 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
2013/07/08 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python基础教程之Filter使用方法
2017/01/17 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
八月迷情观后感
2015/06/11 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
解析MySQL索引的作用
2022/03/03 MySQL
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android