1. 程式人生 > >[Python]將MP3和PDF按名字分類歸檔到各自資料夾

[Python]將MP3和PDF按名字分類歸檔到各自資料夾



原創文章,歡迎轉載。轉載請註明:轉載自 祥的部落格

原文連結:https://blog.csdn.net/humanking7/article/details/84663012


文章目錄

1.問題引出

我下載了一些英語資料,這些資料的命名還好,但是就是沒有用資料夾歸檔,整體感覺很亂,所以打算要將他們用資料夾分類。

計劃是這樣的:

  1. 查詢所有pdfpdf名字建立資料夾,並將對應的pdf檔案,移入資料夾中;
  2. 查詢與pdf名字最接近的MP3檔案,並將其移入對應的資料夾中。

看到明顯是一本書的文字音訊資料

  • 文字:黑貓英語名著3級 02 Alic's Adventures In Wonderland 艾麗絲漫遊奇境記.pdf
  • 音訊:艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 01.mp3

可以發現,他們都有相同的子字串 ,所以先要處理找兩個字串最長公共子串的問題

這部分問題已經在博文 [Python]獲取2個字串的最長公共子串: https://blog.csdn.net/humanking7/article/details/84645055

中得到了解決,現在的問題基本就沒了,主要就是建立資料夾移動檔案

現在把這個問題的解決流程寫出來:

  1. Step0.尋找目錄中所有的MP3和PDF
  2. Step1.將PDF的檔名提取出來
  3. Step2.用PDF的檔名建立目錄
  4. Step3.將PDF移動到新建的目錄中
  5. Step4.查詢和PDF名字(dirName)意思相近的MP3檔名
  6. Step5. 將匹配的MP3檔案移動到對應的資料夾中

在這裡插入圖片描述

2. 原始碼及測試結果

2.1. 程式原始碼

# UTF-8
# 整理檔案
# 問題:
# 一個目錄裡面有PDF和MP3檔案,其中MP3檔名字和PDF名字不是很一致
# eg: # ------------------------------------ # 黑貓英語名著3級 01 Great English Monarchs and Their Times 昔的英國王室.pdf # 黑貓英語名著3級 02 Alic's Adventures in Wonderland 艾麗絲漫遊奇境記.pdf # 黑貓英語名著3級 03 Oscar Wilde's Short Stories 王爾德短篇故事.pdf # 黑貓英語名著3級 04 Hamlet 王子復仇記.pdf # 黑貓英語名著3級 05 The Secret Garden 祕密花園.pdf # 昔日的英國王室 Great English Monarchs And Their Times 02.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 03.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 04.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 05.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 06.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 09.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 10.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 11.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 13.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 14.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 15.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 17.mp3 # 昔日的英國王室 Great English Monarchs And Their Times 18.mp3 # 王子復仇記 Hamlet 01.mp3 # 王子復仇記 Hamlet 03.mp3 # 王子復仇記 Hamlet 04.mp3 # 王子復仇記 Hamlet 05.mp3 # 王子復仇記 Hamlet 06.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 01.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 02.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 03.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 05.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 06.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 07.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 08.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 09.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 12.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 13.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 14.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 16.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 17.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 18.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 20.mp3 # 王爾德短篇故事 Oscar Wilde_s Short Stories 21.mp3 # 祕密花園 The Secret Garden 02.mp3 # 祕密花園 The Secret Garden 04.mp3 # 祕密花園 The Secret Garden 05.mp3 # 祕密花園 The Secret Garden 06.mp3 # 祕密花園 The Secret Garden 07.mp3 # 祕密花園 The Secret Garden 09.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 01.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 02.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 04.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 05.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 06.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 07.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 08.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 11.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 12.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 13.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 15.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 16.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 17.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 19.mp3 # 艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 20.mp3 # ------------------------------------ # 程式要求: # 1.找出所有的PDF檔案,用PDF檔名建立對應的目錄,把PDF移動到對應的目錄中; # 2.分類MP3檔案:名字中與PDF檔案字元最接近的MP3檔案,把MP3移動到對應的目錄中. import os import shutil #import copy def list_folders_files(path): """ 返回 "資料夾" 和 "檔案" 名字 :param path: "資料夾"和"檔案"所在的路徑 :return: (list_folders, list_files) :list_folders: 資料夾 :list_files: 檔案 """ list_folders = [] list_files = [] for file in os.listdir(path): file_path = os.path.join(path, file) if os.path.isdir(file_path): list_folders.append(file) else: list_files.append(file) return (list_folders, list_files) def list_files_with_suffix(path, suffix): """ 返回含有特定"字尾名"的"檔案"名字 :param path: "檔案"所在的路徑 :param suffix: 字尾名 :return: 含有特定"字尾名"的"檔案"名字 """ list_files = [] for file in os.listdir(path): #print(file) file_path = os.path.join(path, file) if not os.path.isdir(file_path): if os.path.splitext(file)[1].lower() == suffix.lower(): list_files.append(file) return list_files def mkdir(path): # 去除首位空格 path=path.strip() # 去除尾部 \ 符號 path=path.rstrip("\\") # 判斷路徑是否存在 # 存在 True # 不存在 False isExists = os.path.exists(path) # 判斷結果 if not isExists: # 如果不存在則建立目錄 # 建立目錄操作函式 os.makedirs(path) # print('建立成功 > ',path) return True else: # 如果目錄存在則不建立,並提示目錄已存在 # print('目錄已經存在 > ',path) return False def getMaxCommonSubstr(s1, s2): # 求兩個字串的最長公共子串 # 思想:建立一個二維陣列,儲存連續位相同與否的狀態 len_s1 = len(s1) len_s2 = len(s2) # 生成0矩陣,為方便後續計算,多加了1行1列 # 行: (len_s1+1) # 列: (len_s2+1) record = [[0 for i in range(len_s2+1)] for j in range(len_s1+1)] maxNum = 0 # 最長匹配長度 p = 0 # 字串匹配的終止下標 for i in range(len_s1): for j in range(len_s2): if s1[i] == s2[j]: # 相同則累加 record[i+1][j+1] = record[i][j] + 1 if record[i+1][j+1] > maxNum: maxNum = record[i+1][j+1] p = i # 匹配到下標i # 返回 子串長度,子串 return maxNum, s1[p+1-maxNum : p+1] def printMatrixList(li): # 列印多維list row = len(li) col = len(li[0]) for i in range(row): for j in range(col): print(li[i][j], end=' ') print('') def findMatchList(l_mp3, str4match): # 將l_mp3中與str4最匹配的list挑出來 # 返回匹配的list和剔除該list的l_mp3 len_BestFit = 0 str_BestFit = '' l_mp3_Match = [] l_mp3_New = [] # step1. 查詢最大的匹配 for i in range(len(l_mp3)): [len_Match,str_Match] = getMaxCommonSubstr(str4match,l_mp3[i]) if len_Match>=len_BestFit: len_BestFit = len_Match str_BestFit = str_Match # step2. 分離,這樣l_mp3[]越來越少,後面查詢次數越來越少 for i in range(len(l_mp3)): [len_Match,str_Match] = getMaxCommonSubstr(str_BestFit,l_mp3[i]) if len_Match>=len_BestFit: l_mp3_Match.append(l_mp3[i]) else: l_mp3_New.append(l_mp3[i]) return l_mp3_New,l_mp3_Match if __name__ == "__main__": dir_root = r"E:\BaiduNetdiskDownload\SSS閱讀\黑貓分級\文字+音訊\level3" # Step0. 尋找目錄中所有的MP3和PDF l_pdf = list_files_with_suffix(dir_root, '.pdf') l_dir = [] l_mp3 = list_files_with_suffix(dir_root, '.mp3') print('PDF檔案數: ', len(l_pdf)) print('MP3檔案數: ', len(l_mp3)) print('') for i in range( len(l_pdf) ): # Step1.將pdf的檔名提取出來 print('要匹配的PDF檔名:') print(l_pdf[i]) # 顯示PDF檔案 dirName = os.path.splitext(l_pdf[i])[0] l_dir.append(dirName) # Step2.用pdf的檔名建立目錄 tmp_dirPath = os.path.join(dir_root,dirName) # 目錄路徑 #暫時註釋 mkdir( tmp_dirPath ) # Step3.將PDF移動到新建的目錄中 tmp_filePath = os.path.join(dir_root,l_pdf[i]) # PDF檔案路徑 #暫時註釋 shutil.move(tmp_filePath, tmp_dirPath) # 移動PDF # Step4.查詢和PDF名字(dirName)意思相近的MP3檔名 [l_mp3,l_mp3_Match] = findMatchList(l_mp3,dirName) print('匹配的MP3檔案數: ',len(l_mp3_Match)) print('匹配的MP3檔名:') # Step5.將匹配的MP3檔案移動到對應的資料夾中 for j in range(len(l_mp3_Match)): print(l_mp3_Match[j]) # 輸出匹配的MP3檔名 tmp_filePath = os.path.join(dir_root,l_mp3_Match[j]) # 匹配的MP3檔案路徑 #暫時註釋 shutil.move(tmp_filePath, tmp_dirPath) # 移動MP3 print('')

2.2. 測試結果

文字提示:

PDF檔案數:  5
MP3檔案數:  55

要匹配的PDF檔名:
黑貓英語名著3級 01 Great English Monarchs and Their Times 昔日的英國王室.pdf
匹配的MP3檔案數:  13
匹配的MP3檔名:
昔日的英國王室 Great English Monarchs And Their Times 02.mp3
昔日的英國王室 Great English Monarchs And Their Times 03.mp3
昔日的英國王室 Great English Monarchs And Their Times 04.mp3
昔日的英國王室 Great English Monarchs And Their Times 05.mp3
昔日的英國王室 Great English Monarchs And Their Times 06.mp3
昔日的英國王室 Great English Monarchs And Their Times 09.mp3
昔日的英國王室 Great English Monarchs And Their Times 10.mp3
昔日的英國王室 Great English Monarchs And Their Times 11.mp3
昔日的英國王室 Great English Monarchs And Their Times 13.mp3
昔日的英國王室 Great English Monarchs And Their Times 14.mp3
昔日的英國王室 Great English Monarchs And Their Times 15.mp3
昔日的英國王室 Great English Monarchs And Their Times 17.mp3
昔日的英國王室 Great English Monarchs And Their Times 18.mp3

要匹配的PDF檔名:
黑貓英語名著3級 02 Alic's Adventures In Wonderland 艾麗絲漫遊奇境記.pdf
匹配的MP3檔案數:  15
匹配的MP3檔名:
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 01.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 02.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 04.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 05.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 06.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 07.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 08.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 11.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 12.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 13.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 15.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 16.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 17.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 19.mp3
艾麗絲漫遊奇境記 Alic_s Adventures In Wonderland 20.mp3

要匹配的PDF檔名:
黑貓英語名著3級 03 Oscar Wilde's Short Stories 王爾德短篇故事.pdf
匹配的MP3檔案數:  16
匹配的MP3檔名:
王爾德短篇故事 Oscar Wilde_s Short Stories 01.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 02.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 03.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 05.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 06.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 07.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 08.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 09.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 12.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 13.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 14.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 16.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 17.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 18.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 20.mp3
王爾德短篇故事 Oscar Wilde_s Short Stories 21.mp3

要匹配的PDF檔名:
黑貓英語名著3級 04 Hamlet 王子復仇記.pdf
匹配的MP3檔案數:  5
匹配的MP3檔名:
王子復仇記 Hamlet 01.mp3
王子復仇記 Hamlet 03.mp3
王子復仇記 Hamlet 04.mp3
王子復仇記 Hamlet 05.mp3
王子復仇記 Hamlet 06.mp3

要匹配的PDF檔名:
黑貓英語名著3級 05 The Secret Garden 祕密花園.pdf
匹配的MP3檔案數:  6
匹配的MP3檔名:
祕密花園 The Secret Garden 02.mp3
祕密花園 The Secret Garden 04.mp3
祕密花園 The Secret Garden 05.mp3
祕密花園 The Secret Garden 06.mp3
祕密花園 The Secret Garden 07.mp3
祕密花園 The Secret Garden 09.mp3

將註釋去掉:

在這裡插入圖片描述


讚賞碼New