mlyde 发表于 2021-9-8 23:51

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


# 用python脚本, 寻找文件夹下的相同文件
在整理文件时, 找到了下载的一个音乐文件夹, 与我另一个音乐文件夹有部分文件相同(但歌曲名不一定相同), 由于文件众多, 通过手动播放对比太麻烦, 于是写了这个脚本, 可找出相同的音乐等。也可用于寻找其他相同文件。
# 说明
可以输入多种文件夹路径的格式, 方便使用。
对比文件是否相同通过对比文件的 MD5 摘要是否相同来判断, 通过递归, 查看文件夹下所有的文件。
若有相同文件, 将相同文件的路径分组, 保存在一个 .csv文件中, 方便查看。

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

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



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 =
                        else:
                            MD5_dict.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('输入文件夹路径: '))

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感谢分享。。。。
页: [1]
查看完整版本: [python]寻找文件夹下的相同文件