- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道之前有人问过这个问题,我也看到了一些答案,但这个问题更多的是关于我的代码和完成这个任务的最佳方式。
我想扫描一个目录并查看该目录中是否有任何重复项(通过检查 MD5 哈希值)。以下是我的代码:
import sys
import os
import hashlib
fileSliceLimitation = 5000000 #bytes
# if the file is big, slice trick to avoid to load the whole file into RAM
def getFileHashMD5(filename):
retval = 0;
filesize = os.path.getsize(filename)
if filesize > fileSliceLimitation:
with open(filename, 'rb') as fh:
m = hashlib.md5()
while True:
data = fh.read(8192)
if not data:
break
m.update(data)
retval = m.hexdigest()
else:
retval = hashlib.md5(open(filename, 'rb').read()).hexdigest()
return retval
searchdirpath = raw_input("Type directory you wish to search: ")
print ""
print ""
text_file = open('outPut.txt', 'w')
for dirname, dirnames, filenames in os.walk(searchdirpath):
# print path to all filenames.
for filename in filenames:
fullname = os.path.join(dirname, filename)
h_md5 = getFileHashMD5 (fullname)
print h_md5 + " " + fullname
text_file.write("\n" + h_md5 + " " + fullname)
# close txt file
text_file.close()
print "\n\n\nReading outPut:"
text_file = open('outPut.txt', 'r')
myListOfHashes = text_file.read()
if h_md5 in myListOfHashes:
print 'Match: ' + " " + fullname
这给了我以下输出:
Please type in directory you wish to search using above syntax: /Users/bubble/Desktop/aF
033808bb457f622b05096c2f7699857v /Users/bubble/Desktop/aF/.DS_Store
409d8c1727960fddb7c8b915a76ebd35 /Users/bubble/Desktop/aF/script copy.py
409d8c1727960fddb7c8b915a76ebd25 /Users/bubble/Desktop/aF/script.py
e9289295caefef66eaf3a4dffc4fe11c /Users/bubble/Desktop/aF/simpsons.mov
Reading outPut:
Match: /Users/bubble/Desktop/aF/simpsons.mov
我的想法是:
1) 扫描目录2) 将 MD5 哈希值 + 文件名写入文本文件3)以只读方式打开文本文件4) 再次扫描目录并检查文本文件...
我发现这不是一个好的方法,而且它不起作用。 “匹配”只是打印出最后处理的文件。
如何让这个脚本真正找到重复项?有人能告诉我完成这项任务的更好/更简单的方法吗?
非常感谢您的帮助。抱歉,这是一篇很长的文章。
最佳答案
识别重复项的明显工具是哈希表。除非您正在处理非常大的文件,否则您可以这样做:
from collections import defaultdict
file_dict = defaultdict(list)
for filename in files:
file_dict[get_file_hash(filename)].append(filename)
在此过程结束时,file_dict
将包含每个唯一哈希的列表;当两个文件具有相同的哈希值时,它们都会出现在该哈希值的列表中。然后过滤 dict 以查找长度超过 1 的值列表,并比较文件以确保它们相同——像这样:
for duplicates in file_dict.values(): # file_dict.itervalues() in Python 2
if len(duplicates) > 1:
# double-check reported duplicates and generate output
或者这个:
duplicates = [files for files in file_dict.values() if len(files) > 1]
get_file_hash
可以使用 MD5;或者它可以像 Ramchandra Apte 在上面的评论中建议的那样简单地获取文件的第一个和最后一个字节;或者它可以简单地使用上面评论中 tdelaney 建议的文件大小。不过,后两种策略中的每一种都更有可能产生误报。您可以将它们结合起来以降低误报率。
如果您正在处理非常 大量文件,您可以使用更复杂的数据结构,例如Bloom Filter。 .
关于python - 通过 hashlib 查找重复文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724376/
Bellow 是一个代码,它将 hashlib.sha256() 与我的 sha256_test() 函数进行比较,该函数是在哈希率性能方面用原始 Python 编写的。 from time impo
我在google上搜索,发现它是预先安装的,不需要使用pip安装 但是当我通过观看 youtube 运行程序编写但运行时它给了我错误 > Enter md5 hash: b73bf7d3ba1a517
我想做一个列表理解,对两个列表中的元素进行哈希处理。我以为它会是这样的: hashes = [hashlib.md5().update(a + b).digest() for a, b in zip(
当我尝试将 ripemd160 与 hashlib 一起使用时,它说找不到它。 我使用easy_install hashlib安装了hashlib,但仍然找不到ripemd160。 我使用的是 Ubu
我在计算/bin/* 目录下所有文件的所有校验和时遇到问题。我正在用 Python 实现 HIDS,所以我需要计算每个文件的校验和并将其保存在列表中……所以我这里的代码只返回/bin/* 目录的第一个
我想知道在 python 2.7 中观察到的行为的实际原因是什么: import hashlib hashlib.md5('foo') == hashlib.md5('foo') 返回错误。但是……
我正在使用 hashlib 模块来检验关于哈希算法的假设,但我得到了奇怪的结果。我用 Windows fciv 程序检查我的结果。我使用的工作流程是这样的: 从用户那里收集文件和算法。 使用该算法打印
我试图用 sha1 加密一个字符串,但我从服务器收到一个错误: "No Module Named hashlib" 通过使用以下代码: import hashlib encrypted = hashl
这是我的代码: import hashlib real = hashlib.sha512("mom") status = True while status: inp = raw_input(
我正在尝试创建一个具有用户交互的哈希函数。这个想法是,用户选择他/她想要的哈希值(即 md5、sha1 等),然后程序完成其余的工作。 我的代码: hashstring = "hashlib" + f
如果我这样做,我会得到这个: >>> import hashlib >>> hashlib.sha224('Nguyễn').hexdigest() Unsupported characters in
我知道之前有人问过这个问题,我也看到了一些答案,但这个问题更多的是关于我的代码和完成这个任务的最佳方式。 我想扫描一个目录并查看该目录中是否有任何重复项(通过检查 MD5 哈希值)。以下是我的代码:
我正在尝试使用 hashlib 模块中的函数 hashlib.md5() 计算文件的 md5 哈希值。 所以我写了这段代码: Buffer = 128 f = open("c:\\file.tct",
我想创建一个 hashlib 实例,update() 它,然后以某种方式保留它的状态。稍后,我想使用此状态数据重新创建对象,并继续 update() 它。最后,我想获取总累积运行数据的 hexdige
我在 Dreamhost 服务器上运行 Python 脚本。我们的 Python 脚本使用 Python 2.7 - 我们进行了自定义安装,因为 Dreamhost 使用 Python 2.6。在 1
我刚刚从源代码安装了 Python 2.6.6,我得到了什么: >>> import hashlib Traceback (most recent call last): File "", lin
我正在努力完全理解加密的工作原理和编码方式,尤其是使用 Python 时。我只是想了解基础知识并以最简单的形式创建代码。 我将在两个不同的站点之间传递用户 ID,但显然我需要使用私钥对其进行加密,以便
The Python 2.7 documentation关于 hashlib 哈希器有这样的说法: hash.update(arg) Update the hash object with t
我正在尝试编写一个脚本,为指定根目录中的所有文件名和目录名生成哈希值。到目前为止,这是我的脚本: import hashlib import os import sys class Hasher:
我正在开发一个小的 python 程序,该程序本质上将使用 word 文件强制执行 md5 哈希。该程序获取您的哈希值,然后您可以选择一个文件用作单词列表。然后它将在文件中逐行检查并生成一个 md5
我是一名优秀的程序员,十分优秀!