Python filecmp在二进制相等文件上返回false

时间:2017-02-28 10:17:10

标签: python zip file-comparison

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

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

    在第一种情况下,我只是直接将文件解压缩到目录中(不会故意保留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(正如预期的那样)。此时文件比较应该返回true(至少根据我的理解)但由于某种原因print(...)的结果总是给我False

    有人知道我在这里做错了什么,或者我对这种情况有误解?

1 个答案:

答案 0 :(得分:0)

问题是此时输出文件可能未关闭(因此可能未完全刷新/写入),因为您在上下文中执行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))