Python filecmp returns false 在二进制文件上

Python filecmp returns false on binary equal files

我有一个 zip 文件和一个目录。如果 zip 文件中包含的文件不存在于目录中或它们不同(不是二进制相等),则应将它们复制到目录中。于是就有了下面两种情况

  1. zip 文件不包含在目录中
  2. 该目录已包含一个与目录中的文件同名的文件

在第一种情况下,我只是将文件直接解压缩到目录中(没有故意保留 zip 的目录结构)。

在第二种情况下,我将文件从 zip 解压到一个临时目录,并将它们与以下代码进行比较

extracted_member = os.path.join(TMP_DIR, os.path.basename(zip_member))
with zipfile.open(zip_member) as member_file, open(extracted_member, 'wb') as target_file:
    shutil.copyfileobj(member_file, target_file)
    print(filecmp.cmp(extracted_member, file_from_dir, False))

所以,如果我 运行 程序两次,但在两次执行之间没有做任何事情,我 运行 进入案例 2(如预期)。此时文件比较应该 return 为真(至少根据我的理解)但是由于某种原因 print(...) 的结果总是给我 False.

有人知道我在这里做错了什么还是我对情况有错误的理解?

问题是此时输出文件可能未关闭(因此可能不完整 flushed/written),因为您正在 内执行 filecmp 操作 上下文块。

在室外进行,以便正确关闭文件:

with zipfile.open(zip_member) as member_file, open(extracted_member, 'wb') as target_file:
    shutil.copyfileobj(member_file, target_file)
print(filecmp.cmp(extracted_member, file_from_dir, False))