[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('输入文件夹路径: '))
学习一下 感谢分享 可以提个小建议吗(不是批评楼主),如果是一样的音乐文件但只是meta info不同,MD5是会判断成不一样的文件的 dgdg感谢分享。。。。
页:
[1]