Как построить объект TarFile в памяти из байтового буфера в Python 3?

можно ли создать объект TarFile в памяти с помощью буфера, содержащего данные tar, без необходимости записывать TarFile на диск и открывать его снова? Мы получаем байты, отправленные через сокет.

что-то вроде этого:

import tarfile
byte_array = client.read_bytes()
tar = tarfile.open(byte_array) # how to do this?
# use "tar" as a regular TarFile object
for member in tar.getmembers():
    f = tar.extractfile(member)
    print(f)

Примечание: одна из причин этого заключается в том, что мы в конечном итоге хотим иметь возможность делать это с несколькими потоками одновременно, поэтому использование временного файла может быть переопределено, если два потока пытаются сделать это одновременно время.

Спасибо за любую помощь!

2 ответов


BytesIO () from модуль IO делает именно то, что вам нужно.

import tarfile, io
byte_array = client.read_bytes()
file_like_object = io.BytesIO(byte_array)
tar = tarfile.open(fileobj=file_like_object)
# use "tar" as a regular TarFile object
for member in tar.getmembers():
    f = tar.extractfile(member)
    print(f)

конечно, что-то вроде этого:

import io

io_bytes = io.BytesIO(byte_array)

tar = tarfile.open(fileobj=io_bytes, mode='r')

(настройки mode чтобы соответствовать формату вашего файла tar, например, возможно 'mode=' r:gz ' и т. д.)