python找遞歸目錄中文件,並移動到一個單獨文件夾中,同時記錄原始文件路徑信息
運營那邊有個需求。
下載了一批視頻文件,由於當時下載的時候陸陸續續創建了很多文件夾,並且,每個文件夾下面還有子文件夾以及視頻文件,子文件夾下面有視頻文件或者文件夾
現在因為需要轉碼,轉碼軟件只能對單個文件夾操作。
這時候找上我,問我能不能幫忙把所有的文件單獨提取出來到一個文件夾中。他們那邊轉碼完畢,還要放回原來的文件夾
這邊琢磨下下。匆忙寫了個腳本。功能實現了。但是代碼需要優化(後面有空了再說吧)
使用遞歸方法獲取每個文件絕對路徑(不要單獨的目錄),並放入列表中。最終存到excel表中
excel表存2列,第一列是每個文件的絕對目錄,第二列是文件名
使用shutil模塊移動文件(這裏是剪切,因為文件比較多。太占空間了)
考慮到目錄中可能存在文件名一致的文件,這樣移動到一個目錄的話可能會覆蓋原來的。
這邊考慮文件名一致的話不移動,但是記錄下路徑。讓運營決定怎麽處理同名的文件(因為可能他們要存2份,或者說文件名一致,實際文件內容是有差別的)
失敗記錄.log文件用於記錄在移動文件過程中某文件名變化或者文件不存在
(因為文件較多,這裏有6000多文件。文件列表很快就獲取到,但是從文件列表逐個移動文件過程中,萬一某文件由於人為操作刪除或者改名了或者其它因素導致列表中文件路徑不對了。因此用了if else判斷記錄下)
重名文件信息.log用於記錄重名文件。這個是給運營看的。讓他們決定如何處理重名文件
這裏多了一些print操作以及time.sleep操作,是為了後面打成exce程序執行的時候好看點,不然一個黑洞洞的窗口不太友善。多一些輸出信息顯得好點(文件太少的話可能瞬間執行完畢了。sleep一下顯得好點)
!!!最後註意下,因為此腳本最後打成exe程序。準備放入某目錄下執行。因此這裏的this_path獲取的是當前路徑。假如自己使用pycharm或者python工具測試,需要指定一下測試路徑
比如this_path="D:\\work\\tmp"
否則可能把你當前目錄下的文件都移走到all_files下面了
import os import xlwt,time,shutil #獲取當前文件所在絕對目錄路徑 this_path=os.path.abspath(‘.‘) #定義個列表存放每個文件路徑,便於後期操作 file_list=[] #創建個方法,統計每個文件路徑,並追加列表中。用到了遞歸 def get_all_file(dir_path): for file in os.listdir(dir_path): # print(file) filepath=os.path.join(dir_path,file) # print(filepath) if os.path.isdir(filepath): get_all_file(filepath) else: file_list.append(filepath) return file_list #執行上面方法,把每個文件絕對路徑追加到列表中 get_all_file(this_path) #定義總目錄名,準備存放列表中所有文件 target_dir=‘all_files‘ #創建一個總視頻目錄,用於存放視頻文件 if not os.path.exists(target_dir): print(target_dir+‘作為總視頻目錄不存在,正在創建.....‘) time.sleep(2) os.mkdir(target_dir) print(target_dir+"總視頻目錄創建成功") time.sleep(2) #創建一個excel表存放文件路徑信息,第一列是目錄,第二列是文件名 wb = xlwt.Workbook() sh = wb.add_sheet(‘文件和目錄信息‘) row_count=0 for file in file_list: dir_filename=os.path.split(file) sh.write(row_count,0,dir_filename[0]) sh.write(row_count,1,dir_filename[1]) row_count+=1 wb.save("文件路徑信息統計結果.xls") #定義個日誌存放異常信息以及重名文件 f_fail = open(‘失敗記錄.log‘,‘a‘) # 追加模式 f_same= open(‘重名文件信息.log‘,‘a‘) # 追加模式 #移動文件 print("開始移動文件.................") time.sleep(2) for file in file_list: if os.path.exists(file): file_name=os.path.split(file)[1] target_path=os.path.join(target_dir,file_name) if os.path.exists(target_path): print(target_dir+"目錄中----"+file_name+"----已經存在,移動失敗") f_same.write(target_dir+"目錄中----"+file_name+"----已經存在,移動"+file+"失敗\r\n") else: shutil.move(file,target_path) time.sleep(0.1) else: print(file,"not exist") f_fail.write(file+"----不存在\r\n") print(file+"----不存在\r\n") time.sleep(0.5) print("程序執行完畢,3秒後退出") time.sleep(3)
把程序打成exe
找到此文件
下面是測試過程
把此exe程序放入0512這個目錄下。執行的時候他會查找每個目錄下的子目錄和文件。並統一放入新創建的all_files目錄中。
同時記錄excel表移動之前的路徑信息。
同名文件不會移動,繼續保持原來的路徑
假如youku目錄下也有個hehe.rtf文件,那麽正常來說0512目錄下或者0512\youku目錄下,有一個hehe.ref文件不會被移動過去。但是會記錄重名文件信息.log中
開始執行(記得關閉殺毒軟件)
執行完畢,多了3個文件。一個excel表記錄原文件路徑的,2個日誌文件
查看重名文件信息日誌
此文件沒被移動
其它目錄下都空了
(尷尬)此exe程序也被移動過去了,這點有點不足(把自己移動過去了)。後期優化下吧
看一下excel表,第一列是原文件目錄名,第二列是此文件名。轉碼之後可以通過excel表路徑信息把文件再移動回去
python找遞歸目錄中文件,並移動到一個單獨文件夾中,同時記錄原始文件路徑信息