好友
阅读权限10
听众
最后登录1970-1-1
|
用python脚本, 寻找文件夹下的相同文件
在整理文件时, 找到了下载的一个音乐文件夹, 与我另一个音乐文件夹有部分文件相同(但歌曲名不一定相同), 由于文件众多, 通过手动播放对比太麻烦, 于是写了这个脚本, 可找出相同的音乐等。也可用于寻找其他相同文件。
说明
可以输入多种文件夹路径的格式, 方便使用。
对比文件是否相同通过对比文件的 MD5 摘要是否相同来判断, 通过递归, 查看文件夹下所有的文件。
若有相同文件, 将相同文件的路径分组, 保存在一个 .csv文件中, 方便查看。
使用方法
1. 运行脚本, 输入要寻找的文件夹目录。
格式可为: Z:\floder , Z:\floder\ , Z:/floder , Z:/floder/ , "Z:\floder" 等。
2. 寻找完成后,若没有相同文件,输出: 没有重复文件 , 若有相同文件会把相同文件的路径保存在 ./repeat.csv 中(每组为一行)。完成后会自动退出。
注意事项
- 若遇到错误(输入了错误路径等), 会出现报错, 可根据错误提示, 排除错误后, 回车键退出, 再次运行脚本即可。
- 可能查看部分文件夹或文件时需要管理员权限, 否则会报错。
[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('输入文件夹路径: '))
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|