字典的加载不完整

时间:2013-01-03 01:40:39

标签: python dictionary loading

披露:我是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"

3 个答案:

答案 0 :(得分:1)

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

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

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

  4. 更新:您正在散列文件名。哈希内容:

    m1 = hashlib.md5(open(filename).read())
    

答案 1 :(得分:0)

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

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

答案 2 :(得分: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相同,但我建议不要添加()。这会在您开始使用元组时引起混淆
  • 散列文件名的内容可能不是您想要的,因为即使两个文件不同但它们具有相同的内容(如2个空文件),它们也会产生相同的散列值。我想这会破坏你想要达到的目的。相反,如果我建议,您可以使用hash(hash(file_location)+hash(file_content)+some_secret_key)更好地使哈希键。 (请原谅我谨慎添加密钥作为额外的安全措施)

祝你的代码和运气好运欢迎来到python!