如何在python3中合并两个targz二进制文件

2024-10-01 05:02:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个二进制I/O流(都继承了BufferedIOBase),它们表示用gzip算法压缩的两个tar档案。你知道吗

有没有什么有效的方法来创造第三个是两个其他的结合?你知道吗

我尝试通过fileobj参数将两个流转换为^{},并将每个成员添加到第三个:

def merge_environment(a: Optional[BinaryIO], b: Optional[BinaryIO]) -> Optional[BinaryIO]:
    """Merge <a> and <b>, returning a new tarfile.TarFile object.

    If two files in <a> and <b> have the same name, the one in <a> prevails."""
    destio = io.BytesIO()

    with tarfile.open(fileobj=a, mode="r:gz") as t1, \
            tarfile.open(fileobj=b, mode="r:gz") as t2, \
            tarfile.open(fileobj=destio, mode="w:gz") as dest:

        t1_members = [m for m in t1.getmembers() if m.name != ""]
        t1_names = [m.name for m in t1.members]
        t2_members = [m for m in t1.getmembers() if m.name != "" and m.name not in t1_names]

        for member in t1_members:
            dest.addfile(member, t1.extractfile(member))
        for member in t2_members:
            dest.addfile(member, t2.extractfile(member))

    destio.seek(0, 0)
    return destio

但是如果任何一个焦油.gz包含目录,因为tarfile.extractfile()对目录无效。你知道吗

有什么解决办法吗?你知道吗


Tags: andnameinforopenoptionalmembert1
1条回答
网友
1楼 · 发布于 2024-10-01 05:02:36

解决方法非常简单,fileobj的参数tarfile.addfile不是强制的,tarinfo就足够了:

destio = io.bytesIO()
with tarfile.open(fileobj=a, mode="r:gz") as t1, \
        tarfile.open(fileobj=b, mode="r:gz") as t2, \
        tarfile.open(fileobj=destio, mode="w:gz") as dest:

    t1_members = [m for m in t1.getmembers()]
    t1_names = t1.getnames()
    t2_members = [m for m in t2.getmembers() if m.name not in t1_names]

    for member in t1_members:
        if member.isdir():
            dest.addfile(member)
        else:
            dest.addfile(member, t1.extractfile(member))

    for member in t2_members:
        if member.isdir():
            dest.addfile(member)
        else:
            dest.addfile(member, t2.extractfile(member))

相关问题 更多 >