吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1955|回复: 4
收起左侧

[Python 转载] [python]寻找文件夹下的相同文件

[复制链接]
mlyde 发表于 2021-9-8 23:51

用python脚本, 寻找文件夹下的相同文件

在整理文件时, 找到了下载的一个音乐文件夹, 与我另一个音乐文件夹有部分文件相同(但歌曲名不一定相同), 由于文件众多, 通过手动播放对比太麻烦, 于是写了这个脚本, 可找出相同的音乐等。也可用于寻找其他相同文件。

说明

可以输入多种文件夹路径的格式, 方便使用。
对比文件是否相同通过对比文件的 MD5 摘要是否相同来判断, 通过递归, 查看文件夹下所有的文件。
若有相同文件, 将相同文件的路径分组, 保存在一个 .csv文件中, 方便查看。  

使用方法

1. 运行脚本, 输入要寻找的文件夹目录。
格式可为: Z:\floder, Z:\floder\, Z:/floder, Z:/floder/, "Z:\floder" 等。
2. 寻找完成后,若没有相同文件,输出: 没有重复文件, 若有相同文件会把相同文件的路径保存在 ./repeat.csv 中(每组为一行)。完成后会自动退出。   

注意事项

  1. 若遇到错误(输入了错误路径等), 会出现报错, 可根据错误提示, 排除错误后, 回车键退出, 再次运行脚本即可。  
  2. 可能查看部分文件夹或文件时需要管理员权限, 否则会报错。



[Python] 纯文本查看 复制代码
import os
import hashlib

MD5_dict = {}
file_num = 0

def lsMD5(lin):
    ''' 遍历文件计算MD5,存入MD5_dict '''
    global file_num
    error_Permission = '\tError: PermissionError!\t可能产生的原因是文件找不到, 或者被占用, 或者无权限访问.'
    error_FileNotFound = '\tError: FileNotFoundError!\t 找不到指定路径.'
    error_NotADirectory = '\tError: NotADirectoryError!\t不是文件夹.'
    try:
        # 获取路径下的文件(夹)列表
        ls = os.listdir(lin)
    except PermissionError:
        print(error_Permission)
    except FileNotFoundError:
        input(error_FileNotFound)
        exit()
    except NotADirectoryError:
        input(error_NotADirectory)
        exit()
    else:
        for name in ls:
            link = lin + name
            if os.path.isfile(link):
                # 为文件
                file_num += 1
                try:
                    with open(link, 'rb') as fp:
                        # 取MD5.转十六进制.转大写
                        MD5 = hashlib.md5(fp.read()).hexdigest().upper()
                        if MD5 not in MD5_dict:
                            MD5_dict[MD5] = [link]
                        else:
                            MD5_dict[MD5].append(link)
                            # print('MD5: ' + MD5)
                except PermissionError:
                    print(error_Permission)
            elif os.path.isdir(link):
                # 为文件夹,递归查找
                lsMD5(link + '/')

def main(link):
    print('find...')
    # 更正传入路径格式
    if link == '':
        link = './'
    link = link.replace('"', '').replace('\\', '/')
    if link[-1] != '/':
        link += '/'

    # 计算MD5
    lsMD5(link)
    print(f'包含文件数: {file_num}')

    repeat = []
    for r in MD5_dict.values():
        # 找到相同的文件,存入repeat列表
        if len(r) > 1:
            repeat.append(r)

    if len(repeat):
        print('重复文件组: ' + str(len(repeat)))
        with open('./repeat.csv', 'w', encoding='utf_8_sig') as fp:
            for line in repeat:
                for each_file in line:
                    fp.write(str(each_file) + ',')
                # print(line)
                fp.write('\n')
    else:
        input('没有重复文件')

if __name__ == "__main__":
    main(input('输入文件夹路径: '))


免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
yjn866y + 1 + 1 我很赞同!
pdjfx + 1 + 1 谢谢@Thanks!

查看全部评分

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

seaclean 发表于 2021-9-9 09:08
学习一下
GaoWALT 发表于 2021-9-9 09:37
sapin 发表于 2021-9-9 09:39
可以提个小建议吗(不是批评楼主),如果是一样的音乐文件但只是meta info不同,MD5是会判断成不一样的文件的
yjn866y 发表于 2021-9-9 09:47
dgdg感谢分享。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 13:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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