Как построить объект 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() из модуля ввода-вывода делает именно то, что вам нужно.
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')
(Adjust mode
чтобы соответствовать формату вашего tar-файла, например, возможно `mode='r:gz' и т. д.)