web-dev-qa-db-ja.com

Python 3のバイトバッファからメモリ内にTarFileオブジェクトを構築する方法は?

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)

注:これを行う理由の1つは、最終的に複数のスレッドで同時にこれを実行できるようにしたいため、2つのスレッドが同時に実行しようとすると、一時ファイルの使用がオーバーライドされる可能性があるためです。

助けてくれてありがとう!

23
Sefu

IOモジュール からの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)
31
decaf

確かに、このようなもの:

import io

io_bytes = io.BytesIO(byte_array)

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

(tarファイルの形式に合うようにmodeを調整します。たとえば、 `mode = 'r:gz'など)

7