0

我想使用 python 在两个不同的 zip 文件中比较两个具有相同名称和相同相对路径的文本文件。

我一直在尝试搜索各种方法,但发现在我的案例中没有一个可用的顶级解决方案。

我的代码:

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".

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

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

4

1 回答 1

1

您应该能够在不使用 的情况下实现此目的Path,因为路径特定于 zipfile,并且不需要以特定于操作系统的方式进行处理。返回的字符串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)))
于 2022-01-03T18:59:14.303 回答