1

披露:我是 python 新手。我正在尝试使用哈希值作为我的键和文件路径作为我的值来加载包含文件的字典。我添加了一个计数器以确保正确加载字典。运行下面的代码后,我有 78 个文件(计数器),但我的字典长度只有 47 个。为什么它没有加载所有 78 个文件?任何帮助是极大的赞赏!

for dirname, dirnames, filenames in os.walk('.'):
    for subdirname in dirnames:
        os.path.join(dirname, subdirname)

    for filename in filenames:
        m1 = hashlib.md5(filename)
        hValue = m1.hexdigest()
        pValue = os.path.join(dirname, filename)
        myDict[(hValue)]=pValue
        counter +=1

print len(myDict), "Dict Length"
print counter, "counter"
4

3 回答 3

1
  1. 您调用os.path.join但不保留该值,因此您的第一个嵌套 for 循环是无用的。我不确定它的目的是什么。

  2. 您不需要创建文件名的 md5 哈希,只需使用文件名作为 dict 的键。

  3. 您可能缺少条目,因为您在不同的目录中有同名的文件。用作os.path.join(dirname, filename)字典的键。

更新:您正在散列文件名。散列内容:

m1 = hashlib.md5(open(filename).read())
于 2013-01-03T01:46:24.563 回答
0

免责声明:这是我在 stackoverflow 中的第一个答案 :)

嗨@Jarid F,

我尝试编写一个完整的程序,以便您自己运行并查看。这是代码:

import os
import hashlib

myDict = {}
counter = 0
for dirname, dirnames, filenames in os.walk('.'):    
    for filename in filenames:
        #get the complete file location so that it's unique
        filename_with_path = os.path.join(dirname, filename)
        m1 = hashlib.md5(filename_with_path)
        #to hash the content of the file:
        #m1 = hashlib.md5(open(filename_with_path).read())
        hValue = m1.hexdigest()    
        myDict[hValue] = filename_with_path
        counter += 1

print len(myDict), "Dict Length"
print counter, "counter"
assert counter == len(myDict)

补充@Ned Batchelder 提供的几点:

  • 该行myDict[(hValue)]=pValue实际上是相同的,myDict[hValue] = pValue但我建议不要添加()in。当您开始使用元组时,这将导致混淆
  • 散列文件名的内容可能不是您想要的,因为即使两个文件不同但它们具有相同的内容(如 2 个空文件),它们也会产生相同的散列值。我想这会破坏您在这里尝试实现的目的。相反,如果我可以建议,您可以hash(hash(file_location)+hash(file_content)+some_secret_key)改进散列键。(请原谅我在添加密钥作为额外安全措施时的谨慎)

祝你的代码好运,欢迎使用 python!

于 2013-01-03T02:24:56.880 回答
0

字典键必须是唯一的(或者您将覆盖与键对应的值),并且您的方法不能保证唯一性。

由于您只是对文件名进行哈希处理,因此如果您的文件名不是唯一的,那么您的哈希值也不会是唯一的。尝试散列完整路径。

于 2013-01-03T01:46:25.730 回答