复制目录: 包含多层子目录
方法: 递归, 深度遍历,广度遍历
深度遍历&广度遍历:
思路:
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,目录,复制
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 群星《前途海量 电影原声专辑》[FLAC/分轨][227.78MB]
- 张信哲.1992-知道新曲与精丫巨石】【WAV+CUE】
- 王翠玲.1995-ANGEL【新艺宝】【WAV+CUE】
- 景冈山.1996-我的眼里只有你【大地唱片】【WAV+CUE】
- 群星《八戒 电影原声带》[320K/MP3][188.97MB]
- 群星《我的阿勒泰 影视原声带》[320K/MP3][139.47MB]
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[320K/MP3][148.91MB]
- 刘雅丽.2001-丽花皇后·EMI精选王【EMI百代】【FLAC分轨】
- 齐秦.1994-黄金十年1981-1990CHINA.TOUR.LIVE精丫上华】【WAV+CUE】
- 群星.2008-本色·百代音乐人创作专辑【EMI百代】【WAV+CUE】
- 群星.2001-同步过冬AVCD【环球】【WAV+CUE】
- 群星.2020-同步过冬2020冀待晴空【环球】【WAV+CUE】
- 沈雁.1986-四季(2012梦田复刻版)【白云唱片】【WAV+CUE】
- 纪钧瀚《胎教古典音乐 钢琴与大提琴的沉浸时光》[FLAC/分轨][257.88MB]
- 《国语老歌 怀旧篇 3CD》[WAV/分轨][1.6GB]