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实现在线音乐播放器
Mar 03 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
Python Socket使用实例
Dec 18 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
python实现代码统计器
Sep 19 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
Python修改DBF文件指定列
Dec 19 Python
Python 线程池模块之多线程操作代码
May 20 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/07/16 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
DOM相关内容速查手册
2007/02/07 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
教师党员批评与自我批评
2014/10/15 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
宪法宣传标语100条
2019/10/15 职场文书