python 實(shí)現(xiàn)目錄復(fù)制的三種小結(jié)
復(fù)制目錄: 包含多層子目錄
方法: 遞歸, 深度遍歷,廣度遍歷
深度遍歷&廣度遍歷:
思路:
1.獲得源目錄子級(jí)目錄,并設(shè)置目標(biāo)目錄的子級(jí)路徑
1.1在此就創(chuàng)建兩個(gè)棧(或者隊(duì)列),將原目錄和目標(biāo)目錄分別添加到棧(或者隊(duì)列)里面,一般用append添加,加在棧的頂部,隊(duì)列的后部
1.2深度遍歷 從棧的頂部取出一個(gè)原路徑去判斷,同時(shí)用同樣的方式取出目標(biāo)路徑(棧和隊(duì)列都類似于list,都可以用list實(shí)現(xiàn))
廣度遍歷 從隊(duì)列的前面取出一個(gè)原路徑去判斷,同時(shí)用同樣的方式取出目標(biāo)路徑
2.判斷原子級(jí)路徑是否是文件
2.1如果目標(biāo)子級(jí)文件不存在 或者目標(biāo)子級(jí)文件存在,但是子級(jí)大小不一致,則復(fù)制
3.判斷原子級(jí)目錄是否是目錄
3.1.遞歸 調(diào)用自己,把自己的子級(jí)目錄當(dāng)作源文件,復(fù)制到目標(biāo)子級(jí)目錄
3.2.深度遍歷 廣度遍歷 都將原目錄和目標(biāo)目錄添加(append)到棧(隊(duì)列)的后面'''
# 深度遍歷 廣度遍歷(僅取出來的方式不一樣) # 導(dǎo)入模塊 import os, collections def copyDir(sourcePath,targetPath): # 傳入原目錄,和需要復(fù)制后的目標(biāo)目錄 # 判斷需要復(fù)制的目錄是否存在,如果不存在就返回 if not os.path.isdir(sourcePath): return '源目錄不存在' # 創(chuàng)建兩個(gè)棧,一個(gè)用來存放原目錄路徑,另一個(gè)用來存放需要復(fù)制的目標(biāo)目錄 sourceStack = collections.deque() sourceStack.append(sourcePath) targetStack = collections.deque() targetStack.append(targetPath) # 創(chuàng)建一個(gè)循環(huán)當(dāng)棧里面位空時(shí)結(jié)束循環(huán) while True: if len(sourceStack) == 0: break # 將路徑從棧的上部取出 sourcePath = sourceStack.pop() #sourcePath = sourceStack.popleft() # 遍歷出該目錄下的所有文件和目錄 listName = os.listdir(sourcePath) # 將目錄路徑取出來 targetPath = targetStack.pop() #targetPath = targetStack.popleft() # 判斷該目標(biāo)目錄是否存在,如果不存在就創(chuàng)建 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) # 判斷是否時(shí)目錄 if os.path.isdir(sourceAbs): # 判斷目標(biāo)路徑是否存在,如果不存在就創(chuàng)建一個(gè) if not os.path.exists(targetAbs): os.makedirs(targetAbs) # 將新的目錄添加到棧的頂部 sourceStack.append(sourceAbs) targetStack.append(targetAbs) # 判斷是否是文件 if os.path.isfile(sourceAbs): # 1.如果目標(biāo)子級(jí)文件不存在 或者目標(biāo)子級(jí)文件存在但是該文件與原子級(jí)文件大小不一致 則需要復(fù)制 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: # 一點(diǎn)一點(diǎn)讀取,防止當(dāng)文件較大時(shí)候內(nèi)存吃不消 content = rf.read(1024*1024*10) if len(content) == 0: break wf.write(content) # 寫入緩沖區(qū)時(shí)候手動(dòng)刷新一下,可能會(huì)加快寫入 wf.flush() # 讀寫完成關(guān)閉文件 rf.close() wf.close() # 傳入需要復(fù)制的目錄和需要復(fù)制到的目標(biāo)目錄 sPath = "" tPath = "" copyDir(sPath,tPath)
遞歸遍歷:
遞歸思路:
1.定義一個(gè)函數(shù)來復(fù)制目錄,需要傳入原目錄和目標(biāo)目錄
2.判斷源目錄是否是一個(gè)目錄--不是就終止
3.判斷目標(biāo)目錄是否存在--不存在,新建
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): #創(chuàng)建目標(biāo)目錄 if not os.path.exists(targetAbs): os.makedirs(targetAbs) copyDir(sourceAbs,targetAbs) if os.path.isfile(sourceAbs): # 1.如果目標(biāo)子級(jí)文件不存在 或者 目標(biāo)子級(jí)文件存在但是該文件與原子級(jí)文件大小不一致 則需要復(fù)制 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() # 測(cè)試 sPath = "" tPath = "" copyDir(sPath,tPath)
以上這篇python 實(shí)現(xiàn)目錄復(fù)制的三種小結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python列表:開始、結(jié)束、步長(zhǎng)值實(shí)例
這篇文章主要介紹了python列表:開始、結(jié)束、步長(zhǎng)值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Python自動(dòng)生成代碼 使用tkinter圖形化操作并生成代碼框架
這篇文章主要為大家詳細(xì)介紹了Python自動(dòng)生成代碼,使用tkinter圖形化操作并生成代碼框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09python使用os.listdir和os.walk獲得文件的路徑的方法
本篇文章主要介紹了python使用os.listdir和os.walk獲得文件的路徑的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12python神經(jīng)網(wǎng)絡(luò)使用Keras構(gòu)建RNN訓(xùn)練
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)使用Keras構(gòu)建RNN網(wǎng)絡(luò)訓(xùn)練,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-05-05Python編程快速上手——Excel到CSV的轉(zhuǎn)換程序案例分析
這篇文章主要介紹了Python Excel到CSV的轉(zhuǎn)換程序,結(jié)合具體案例形式分析了Python操作Excel到CSV轉(zhuǎn)換的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-02-02