У меня есть два потока двоичного ввода-вывода (оба наследуют BufferedIOBase ), которые представляют два архива tar, сжатых с помощью алгоритма gzip.
Есть ли эффективный способ создания третьегокакая комбинация двух других?
Я попытался преобразовать оба потока в tarfile.Tarfile
с помощью аргументов 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
Но это не сработает, если какой-либо из tar.gz содержит каталог, поскольку tarfile.extractfile()
не работает с каталогом.
Любое решение?