如何在Python 3中合并两个tar gz BinaryIO

时间:2019-07-09 20:49:36

标签: python python-3.x tarfile

我有两个Binary I / O流(均为BufferedIOBase的继承),代表两个使用gzip算法压缩的tar归档文件。

有没有一种有效的方法来创建第三个方法,即将其他两个方法结合起来?

我尝试通过fileobj参数将两个流都转换为tarfile.Tarfile并将每个成员添加到第三个成员:

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

但是如果任何 tar.gz 包含目录,这将不起作用,因为tarfile.extractfile()在目录上不起作用。

任何解决方案吗?

1 个答案:

答案 0 :(得分:0)

解决方案非常简单,fileobj的{​​{1}}参数不是强制性的,tarfile.addfile就足够了:

tarinfo