[Python]将MP3和PDF按名字分类归档到各自文件夹

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/humanking7/article/details/84663012


原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接: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

猜你喜欢

转载自blog.csdn.net/humanking7/article/details/84663012
今日推荐