吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9525|回复: 44
收起左侧

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

   关闭 [复制链接]
CatciSurn 发表于 2022-6-6 20:43
本帖最后由 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!
无标题1.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
禁止发春 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

立竿见影 发表于 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
耳朵得到了享受
头像被屏蔽
tl;dr 发表于 2022-6-7 05:33
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表