佇列、棧和遞迴遍歷目錄
阿新 • • 發佈:2018-11-10
棧
棧是一種記憶體結構,先進後出,後進先出。python中沒有棧的概念,我們目前只能仿寫。
# 模擬棧結構 stack = [] # 入棧(新增元素) stack.append("A") print(stack) stack.append("B") print(stack) stack.append("C") print(stack) #入棧順序 A B C # 出棧(移除元素) stack.pop() print(stack) stack.pop() print(stack) #出棧順序 C B A
佇列
佇列也是一種記憶體結構,先進先出,後進後出。
建立佇列
import collections queue = collections.deque() # 進隊(向佇列中新增元素) queue.append("A") queue.append("B") queue.append("C") print(queue) # 出隊(移除佇列中的元素) queue.popleft() print(queue) queue.popleft() print(queue)
遞迴遍歷目錄和檔案
importos path = r'F:\PycharmProjects\basic gram\作業和習題\test' def getAllFileAndDir(path): # 獲取當前目錄下所有檔案及檔案目錄 fileList = os.listdir(path) # print(fileList) # 遍歷fileList列表 for fileName in fileList: # isdir isfile # print(fileName) # 拼接絕對路徑 absFile = os.path.join(path,fileName)if os.path.isdir(absFile): print(absFile+'---目錄') getAllFileAndDir(absFile) else: print(absFile+'---檔案') getAllFileAndDir(path)
棧 深度遍歷
import collections def getAllFileAndDir(sourcePath): stack = collections.deque() stack.append(sourcePath) while len(stack) != 0: path = stack.pop() fileList = os.listdir(path) for fileName in fileList: absFile = os.path.join(path, fileName) if os.path.isdir(absFile): print(absFile+'---目錄') stack.append(absFile) else: print(absFile+'---檔案') getAllFileAndDir(path)
佇列 廣度遍歷
def getAllFileAndDir(sourcePath): queue = collections.deque() queue.append(sourcePath) while len(queue) !=0: path = queue.popleft() fileList = os.listdir(path) for fileName in fileList: absFile = os.path.join(path, fileName) if os.path.isdir(absFile): print(absFile+'---目錄') queue.append(absFile) else: print(absFile+'---檔案') getAllFileAndDir(path)
複製目錄和檔案
import os # 複製目錄 def copyDir(sourDir,targetDir): if not os.path.exists(sourDir): print("如果源目錄不存在,直接停止") return if not os.path.exists(targetDir): os.makedirs(targetDir) listName = os.listdir(sourDir) for dirNameAndFileName in listName: sourAbsPath = os.path.join(sourDir,dirNameAndFileName) targetAbsPath = os.path.join(targetDir,dirNameAndFileName) if os.path.isdir(sourAbsPath): copyDir(sourAbsPath,targetAbsPath) if os.path.isfile(sourAbsPath): # 如果目標檔案不存在, 或者 如果該檔案已經存在但是檔案大小不一樣 if (not os.path.exists(targetAbsPath)) or (os.path.exists(targetAbsPath) and (os.path.getsize(sourAbsPath) != os.path.getsize(targetAbsPath))): rf = open(sourAbsPath,"rb") wf = open(targetAbsPath,"wb") while True: content = rf.read(1024*1024) if len(content) == 0: break wf.write(content) wf.flush() wf.close() rf.close() sPath = r'F:\PycharmProjects\basic gram\作業和習題\test' tPath = r'F:\PycharmProjects\basic gram\作業和習題\testNew' copyDir(sPath, tPath)
檔案複製例項
1.一個函式接受資料夾的名稱作為輸入引數,請將該資料夾中的所有檔案複製到 資料夾名-副本 中去,請補充缺失的程式碼. (20分)
def copyFile(sPath)
2.題1複製過程中,每隔一秒列印一次複製進度(即當前已複製個數/總檔案個數)(15分)
import os import collections import time import sys def getFileNum(sPath): num = 0 stack = collections.deque() stack.append(sPath) while len(stack) != 0: path = stack.pop() fileList = os.listdir(path) for fileName in fileList: absFile = os.path.join(path, fileName) if os.path.isdir(absFile): stack.append(absFile) else: num += 1 return num def copyFile(sPath): tPath = r'F:\PycharmProjects\basic gram\作業和習題\Anaconda3-副本' stack1 = collections.deque() stack1.append(sPath) stack2 = collections.deque() stack2.append(tPath) timepoint = 1 filenum = 0 while len(stack1) != 0: sPath = stack1.pop() tPath = stack2.pop() if not os.path.exists(tPath): os.makedirs(tPath) listName = os.listdir(sPath) for filename in listName: absfile = os.path.join(sPath, filename) tabsfile = os.path.join(tPath, filename) if os.path.isdir(absfile): stack1.append(absfile) stack2.append(tabsfile) else: rf = open(absfile, 'rb') wf = open(tabsfile, 'wb') while True: content = rf.read(1024*1024) if len(content) == 0: break wf.write(content) # 重新整理緩衝區 wf.flush() if time.clock()//1 == timepoint: sys.stdout.write('\r進度:%d/%d'%(filenum,num)) timepoint += 1 wf.close() rf.close() filenum += 1 sys.stdout.write('\r進度:%d/%d' % (num, num)) sPath = r'F:\PycharmProjects\basic gram\作業和習題\Anaconda3' num = getFileNum(sPath) # print(num) start_time = time.clock() copyFile(sPath)