使用 python 比较 zip 文件中的两个文本文件

Comparing two text files inside zip files using python

我想使用 python.

比较两个不同 zip 文件中具有相同名称和相同相对路径的两个文本文件

我一直在尝试搜索各种方法,发现 none 最适合我的解决方案。

我的代码:

from zipfile import ZipFile
from pathlib import Path

with ZipFile(zip_path1) as z1, ZipFile(zip_path2) as z2:
    file1_paths = [Path(filepath) for filepath in z1.namelist()]
    file12_paths = [Path(filepath) for filepath in z12.namelist()]
    cmn = list(set(file1_paths ).intersection(set(file12_paths )))
    common_files = [filepath for filepath in cmn if str(filepath).endswith(('.txt', '.sh'))]

    for f in common_files:
        with z1.open(f, 'r') as f1, z2.open(f, 'r') as f2:
            if f1.read() != f2.read(): # Also used io.TextIOWrapper(f1).read() here
                print('Difference found for {filepath}'.format(filepath=str(f))

注:

这里的路径我使用了pathlib。在 with z1.open(f, 'r')... 行中,如果我使用 pathlib 路径而不是对路径进行硬编码,我将得到 <class 'KeyError'>: "There is no item named WindowsPath('SomeFolder/somefile.txt') in the archive".

此外,即使我对路径进行硬编码,用于比较的文件读取缓冲区也总是空的。所以在这种情况下比较实际上不起作用。

我被困在这个奇怪的案例中,非常感谢任何帮助。

您应该能够在不使用 Path 的情况下实现这一点,因为路径是特定于 zip 文件的,不需要以特定于 os 的方式进行处理。 namelist() 返回的字符串可用于比较和作为 open() 的参数,如下所示:

from zipfile import ZipFile

with ZipFile(zip_path1) as z1, ZipFile(zip_path2) as z2:
    common_files = [x for x in set(z1.namelist()).intersection(set(z2.namelist())) if x.endswith('.txt') or x.endswith('.sh')]
    # print(common_files)

    for f in common_files:
        with z1.open(f) as f1, z2.open(f) as f2:
            if f1.read() != f2.read():
                print('Difference found for {filepath}'.format(filepath=str(f)))