【问题标题】:Select and compare two files MD5 using Python使用 Python 选择并比较两个文件 MD5
【发布时间】:2020-03-06 07:31:43
【问题描述】:

我想根据以下链接中的答案操作代码: Compare md5 hashes of two files in python

我的预期结果是搜索我要比较的两个文件,然后执行脚本的其余部分,以回答 MD5 文件匹配是否为“真”,否则为“假”。

我尝试了以下代码:

import hashlib
from tkinter import *
from tkinter import filedialog

digests = []

z = filedialog.askopenfilenames(initialdir="/", title="Browse Files", filetypes=(("excel files", "*.xlsx"),
                                                                                             ("all files", "*.*")))

b = filedialog.askopenfilenames(initialdir="/", title="Browse Files", filetypes=(("excel files", "*.xlsx"),
                                                                                             ("all files", "*.*")))
filez = z, b

for filename in filez:
    hasher = hashlib.md5()
    with open(filename, 'rb') as f:
        buf = f.read()
        hasher.update(buf)
        a = hasher.hexdigest()
        digests.append(a)
        print(a)

print(digests[0] == digests[1])

很遗憾,我收到以下错误: "TypeError: 预期的 str、bytes 或 os.PathLike 对象,而不是元组"

提前致谢。

【问题讨论】:

    标签: python md5 tk hashlib


    【解决方案1】:

    filedialog.askopenfilenames 返回一个元组。这意味着zb 以及for 循环的filename 迭代器是元组。您收到错误是因为您将 filename(它是一个元组)传递给 open 函数。

    解决此问题的一种方法是简单地连接元组。

    filez = z + b
    

    【讨论】:

      【解决方案2】:

      使用这行代码修复了上述错误:

      filez = z[0], b[0]
      
      

      【讨论】:

      • 之所以有效,是因为您使用的是askopenfilenames 而不是askopenfilename(请注意末尾的s)。如果你想有两个对话框,你应该使用单数,否则你可以在一个调用中使用复数,你的文件将在返回值中为[0][1]
      猜你喜欢
      • 2012-03-18
      • 2016-08-20
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      相关资源
      最近更新 更多