侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python 实现目录复制的三种小结

Python  /  管理员 发布于 7年前   203

复制目录: 包含多层子目录

方法: 递归, 深度遍历,广度遍历

深度遍历&广度遍历:

思路:

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:  breakwf.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 实现目录复制的三种小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    python3中numpy函数tile的用法详解
    下一条:
    python求绝对值的三种方法小结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客