车载音乐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
感谢楼主热心分享,电脑里手机里有很多重复的东西,却在不同的位置,你这个查重的很有用。纯小白想问一下你 ...
把成品代码里的"F:\\"换成你需要查重的文件夹,然后运行代码。
在result.txt里找到Duplicate dict这两个单词,然后回你的文件夹里搜索(电脑自带的文件夹搜索),把重复的删掉就可以了
比如图片里的第一个
Duplicate dict:{'有多少爱可以重来': ......}
在你的文件夹里搜索 有多少爱可以重来,然后电脑会显示出多个同名的文件,你就选一个不好听的删掉就好了 点赞,收藏,一气呵成。 老哥不准备打包一个成品出来?
点赞,收藏,一气呵成。 收藏了,期待来个成品 感谢楼主热心分享机会试试看 了liao 发表于 2022-6-6 22:26
老哥不准备打包一个成品出来?
啊这,我以为这是原生库就不用打包了。改天有时间再完善一下吧 耳朵得到了享受{:1_921:}