CatciSurn 发表于 2022-6-6 20:43

车载音乐U盘重复歌曲太多?让Python来帮你!

本帖最后由 CatciSurn 于 2022-6-6 20:43 编辑

好久没发帖了,今天心情好,来水一贴
{:301_997:}

背景
老爹的U盘里下了很多歌,他也没注意这些歌里有些是不是重复的,就一北汽下载下来了。所以,在车上放歌的时候就会有很多重复,导致听众(他自己)体验及其不好。

但是由于歌曲过多,一个个看眼花缭乱。可能找到删除以后,耳朵得到了享受,但遭罪的就是眼睛了。
{:301_971:}

万能的Python赐予我力量!在仅仅依靠原生库的情况下,这件事不费吹灰之力()
解决
这U盘里面的歌不是散着放的,里面还有很多子文件夹。我们只想删除一个子文件夹里重复的歌曲,而不是整个U盘都查重。但是一个个输入文件夹名字又太麻烦。



所以我们可以先扫描os库内的所有文件,然后再把不是文件夹的给筛出
dbtype_list = os.listdir("F:\\")

for dbtype in dbtype_list[::]:
    if os.path.isfile(os.path.join("F:\\",dbtype)):
      dbtype_list.remove(dbtype)

考虑到歌单里能够区分歌曲不同的是汉字,我们就可以对每个文件夹内的文件名遍历,只取用汉字。

def is_chinese(uchar):
      if uchar >= '\u4e00' and uchar <= '\u9fa5':
            return True
      else:
            return False

    def reserve_chinese(content):
      content_str = ''
      for i in content:
            if is_chinese(i):
                content_str += i
      return content_str

    for i in range(len(files)):
      files = reserve_chinese(files)

接着就是查重,最基本的Hash表法(效率很低,但又不是做OI,也没必要用效率高的)
def rename_duplicate(list, print_result=False):
      new_list=.count(v) + 1) if list.count(v) > 1 else v for i, v in enumerate(list)]
      if print_result:
            print("Renamed list:",new_list)
      return new_list

    def clean_duplicate(list,print_result=False):
      no_duplicate_list=[]
      duplicate_list=[]
      duplicate_dict={}
      for ele in list:
            duplicate_list.append(ele)
            if ele not in no_duplicate_list:
                no_duplicate_list.append(ele)
            else:
                ind=len(duplicate_list)-1
                duplicate_dict=duplicate_dict.get(ele,)
                duplicate_dict.append(ind)
      if print_result:
            print('Origin list:',duplicate_list,'\nNew list:',no_duplicate_list,'\nDuplicate dict:',duplicate_dict,"\n",file = open(r'result.txt','a'))
      return duplicate_list,no_duplicate_list,duplicate_dict


    origin_list=files
    _,no_duplicate_list,duplicate_dict=clean_duplicate(origin_list,True)
    renamed_list=rename_duplicate(origin_list,True)

成品
import os
from collections import Counter   #引入Counter

dbtype_list = os.listdir("F:\\")

for dbtype in dbtype_list[::]:
    if os.path.isfile(os.path.join("F:\\",dbtype)):
      dbtype_list.remove(dbtype)

for curDir in dbtype_list:
    try:
      files = os.listdir("F:\\" + curDir)
      t = os.listdir("F:\\" + curDir)
    except:
      continue

    print("下面开始搜索:",curDir,"\n",file = open(r'result.txt','a'))
    for i in range(len(t)):
      a = t.split('-')
      files = a
      if(len(a) > 1):
            for j in a:
                files.append(j)

    def is_chinese(uchar):
      if uchar >= '\u4e00' and uchar <= '\u9fa5':
            return True
      else:
            return False

    def reserve_chinese(content):
      content_str = ''
      for i in content:
            if is_chinese(i):
                content_str += i
      return content_str

    for i in range(len(files)):
      files = reserve_chinese(files)
    def rename_duplicate(list, print_result=False):
      new_list=.count(v) + 1) if list.count(v) > 1 else v for i, v in enumerate(list)]
      if print_result:
            print("Renamed list:",new_list)
      return new_list

    def clean_duplicate(list,print_result=False):
      no_duplicate_list=[]
      duplicate_list=[]
      duplicate_dict={}
      for ele in list:
            duplicate_list.append(ele)
            if ele not in no_duplicate_list:
                no_duplicate_list.append(ele)
            else:
                ind=len(duplicate_list)-1
                duplicate_dict=duplicate_dict.get(ele,)
                duplicate_dict.append(ind)
      if print_result:
            print('Origin list:',duplicate_list,'\nNew list:',no_duplicate_list,'\nDuplicate dict:',duplicate_dict,"\n",file = open(r'result.txt','a'))
      return duplicate_list,no_duplicate_list,duplicate_dict


    origin_list=files
    _,no_duplicate_list,duplicate_dict=clean_duplicate(origin_list,True)
    renamed_list=rename_duplicate(origin_list,True)


Thanks for reading!

立竿见影 发表于 2022-6-6 21:10

感谢楼主热心分享,电脑里手机里有很多重复的东西,却在不同的位置,你这个查重的很有用。纯小白想问一下你这成品怎么运行?

CatciSurn 发表于 2022-6-7 14:34

立竿见影 发表于 2022-6-6 21:10
感谢楼主热心分享,电脑里手机里有很多重复的东西,却在不同的位置,你这个查重的很有用。纯小白想问一下你 ...

把成品代码里的"F:\\"换成你需要查重的文件夹,然后运行代码。
在result.txt里找到Duplicate dict这两个单词,然后回你的文件夹里搜索(电脑自带的文件夹搜索),把重复的删掉就可以了

比如图片里的第一个
Duplicate dict:{'有多少爱可以重来': ......}
在你的文件夹里搜索 有多少爱可以重来,然后电脑会显示出多个同名的文件,你就选一个不好听的删掉就好了

v20471188 发表于 2022-6-6 22:08

点赞,收藏,一气呵成。

了liao 发表于 2022-6-6 22:26

老哥不准备打包一个成品出来?

大杀特杀R 发表于 2022-6-6 22:42


点赞,收藏,一气呵成。

LX494542 发表于 2022-6-6 22:49

收藏了,期待来个成品

戰龍在野 发表于 2022-6-6 22:50

感谢楼主热心分享机会试试看

CatciSurn 发表于 2022-6-7 00:21

了liao 发表于 2022-6-6 22:26
老哥不准备打包一个成品出来?

啊这,我以为这是原生库就不用打包了。改天有时间再完善一下吧

狂侠先森 发表于 2022-6-7 02:49

耳朵得到了享受{:1_921:}

tl;dr 发表于 2022-6-7 05:33

页: [1] 2 3 4 5
查看完整版本: 车载音乐U盘重复歌曲太多?让Python来帮你!