网络编程
位置:首页>> 网络编程>> Python编程>> python 实现目录复制的三种小结

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

作者:weixin_42269099  发布时间:2023-09-01 12:17:20 

标签:python,目录,复制

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

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

深度遍历&广度遍历:

思路:

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)

来源:https://blog.csdn.net/weixin_42269099/article/details/80634208

0
投稿

猜你喜欢

  • 我们可用ADO STREAM来做一个无组件的上传程序。Stream对象包含了许多操作二进制和文本文件的方法,我们现在用Stream对象来操作
  • 今天我们来写一个有管理功能的留言板程序。所谓的管理功能,其实就是每条留言前有一个选择框,点中要删除的留言,或者点“删除所有留言”,就完成了批
  • 一、正则表达式概述 如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。请回想一下在硬盘上是
  • 尽管有很多规范URL的标准,例如RFC 3987,但实际应用中却非常混乱。本文主要介绍浏览器发送URL到服务器的一些特性,作为开发和应用的参
  •     Dreamweaver(以下简称DW)提供了一种称为“Behavior”(行为)的机制,帮助你构建页面
  • 北京邮电大学 张剑XML的局限性目前,许多Web网站的内容数据都存放在数据库或数据文件中。对于Web程序开发人员来说,如果要想把有用的信息从
  • MySQL有6种日志,监控数据库系统的时候必须知道select日志slow select日志变更日志二进制变更日志(binlog) 
  • 项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在
  • 总结了部分所学、所听、所看、所问的一些CSS写作经验,书写高效的CSS - 漫谈CSS的渲染效率,它们与渲染效率及所占用
  • UPDATE语句的速度更新查询的优化同SELECT查询一样,需要额外的写开销。写速度依赖于更新的数据大小和更新的索引的数量。没有更改的索引不
  • 按单字节计算字符串的长度,汉字算两个字节。<script  type="text/JavaScript"
  • 1.建立Recordset对象Dim objMyRstSet objMyRst=Server.CreateObject(&ldquo
  • SQL Server数据库日志清除的两个方法:方法一一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,
  • 又发现一个IE不标准的地方,unshift方法会返回新数组的长度,但IE6与IE7则返回undefined。var a = [3,2,1,4
  • 如何用表单在线建立目录?很简单,两个文件就搞定了:creatfolder.htm' 表单文件<form n
  • 之前写了一个ajax上传工具。但是只是客户端的工具是我写的,服务器端的那个程序,我是修改了一个网上流传的无组件上传类。因为当时我还不懂什么a
  • 作为设计主管,Peter Stern 已经领导 microsoft.com 重新设计了主页并且开发了五个不同的交互工具,这些工具被用于下载中
  • 前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览器专
  • MSDN:包含正在 SQL Server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。 视图中主要的字段: 1. Spi
  • 网络开发的在分页上要是遇到数(几十)万以上的数据还是用ADO那样的分页会速度很慢的。有了存储过程速度就快多了。下面是本人用50万的数据进行的
手机版 网络编程 asp之家 www.aspxhome.com