我知道以前已经问过这个问题,并且已经看到了一些答案,但是这个问题更多地是关于我的代码和完成此任务的最佳方法。
我想扫描一个目录,并查看该目录中是否存在任何重复项(通过检查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
将包含每个唯一哈希的列表;当两个文件具有相同的哈希时,它们都将出现在该哈希的列表中。然后过滤字典以查找长度超过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在上面的注释中建议的那样简单地获取文件的开头和结尾字节;或者它可以像上面评论中建议的那样简单地使用文件大小。不过,后两种策略中的每一种都更有可能产生误报。您可以将它们组合以减少误报率。
如果你有一个工作 非常
大量的文件,你可以使用一个更复杂的数据结构像一个布隆过滤器。
问题内容: 如果我使用它,它就会出现..很明显,屏幕上没有任何“找到你”的信息。我究竟做错了什么? 问题答案: 问题是您试图在元素存在之前对其进行访问。您需要等待页面完全加载。一种可能的方法是使用处理程序: 不过,大多数常见的JavaScript库都提供DOM就绪事件。这样比较好,因为也要等待所有图像。在大多数情况下,您不需要这样做。 另一种方法是将script标签放在您的-tag 之前,因为它前
我正在用Java开发一个使用JPA的路线规划系统。我需要创建一个findBy方法,通过包含它的城市列表来查找路线。以下是课程: 现在我尝试了,但并不惊讶它不起作用,如下所示: 有没有一种简单的方法可以使用JPA,或者我必须编写一个困难的自己的@Query并以某种方式迭代,才能通过集合找到一个实体?
问题 你需要写一个涉及到文件查找操作的脚本,比如对日志归档文件的重命名工具, 你不想在Python脚本中调用shell,或者你要实现一些shell不能做的功能。 解决方案 查找文件,可使用 os.walk() 函数,传一个顶级目录名给它。 下面是一个例子,查找特定的文件名并答应所有符合条件的文件全路径: #!/usr/bin/env python3.3 import os def findfil
我想找到“cost”tag=505.921435631349的元素的路径,我尝试过这样做,我总是有空值,这是我做过的一件事,它或多或少给了我想要的东西,它工作不正常,我将在java中使用这个路径来获得包含特定值的cost tag下面的值 我的xpath请注意,此xml文件是动态的 xml文件
可能重复: 良好的scalaz介绍 我想了解更多关于Scalaz的知识,一旦Scalaz7被宣布稳定,我可能会使用它来避免重新连接我的大脑。我的问题是Scalaz包含了很多功能。虽然它的大部分是独立于其他部分的,但我想鸟瞰一下Scalaz提供的全局功能以及它是如何组织的。据我所知,Scalaz提供了很多东西, 、和特征, 新的monads,例如(编辑:原来它只是一个应用程序) 单声道变压器(,..
实际上,在我的应用程序中,在发送意图后,我创建了一个名为myfile的文件。asc现在我正试图通过ADB获取该文件,但问题是通过使用 或 它回来了 “远程对象不存在” 通过单击文件并复制路径,该路径实际上是从Android Studio设备文件资源管理器获取的。