本帖最后由 CatciSurn 于 2022-6-6 20:43 编辑
好久没发帖了,今天心情好,来水一贴
背景
老爹的U盘里下了很多歌,他也没注意这些歌里有些是不是重复的,就一北汽下载下来了。所以,在车上放歌的时候就会有很多重复,导致听众(他自己)体验及其不好。
但是由于歌曲过多,一个个看眼花缭乱。可能找到删除以后,耳朵得到了享受,但遭罪的就是眼睛了。
万能的Python赐予我力量!在仅仅依靠原生库的情况下,这件事不费吹灰之力()
解决
这U盘里面的歌不是散着放的,里面还有很多子文件夹。我们只想删除一个子文件夹里重复的歌曲,而不是整个U盘都查重。但是一个个输入文件夹名字又太麻烦。
所以我们可以先扫描os库内的所有文件,然后再把不是文件夹的给筛出
[Python] 纯文本查看 复制代码 dbtype_list = os.listdir("F:\\")
for dbtype in dbtype_list[::]:
if os.path.isfile(os.path.join("F:\\",dbtype)):
dbtype_list.remove(dbtype)
考虑到歌单里能够区分歌曲不同的是汉字,我们就可以对每个文件夹内的文件名遍历,只取用汉字。
[Python] 纯文本查看 复制代码 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[i] = reserve_chinese(files[i])
接着就是查重,最基本的Hash表法(效率很低,但又不是做OI,也没必要用效率高的)
[Python] 纯文本查看 复制代码 def rename_duplicate(list, print_result=False):
new_list=[v + str(list[:i].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[ele]=duplicate_dict.get(ele,[list.index(ele)])
duplicate_dict[ele].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)
成品
[Python] 纯文本查看 复制代码 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[i].split('-')
files[i] = a[0]
if(len(a) > 1):
for j in a[1:]:
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[i] = reserve_chinese(files[i])
def rename_duplicate(list, print_result=False):
new_list=[v + str(list[:i].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[ele]=duplicate_dict.get(ele,[list.index(ele)])
duplicate_dict[ele].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! |