如何在Python 3中从字节缓冲区构建一个TarFile对象到内存中?

44

有没有可能使用包含tar数据的缓冲区在内存中创建一个TarFile对象,而不必先将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个回答

55

来自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)

5
可能需要根据您所要执行的操作添加模式(存档到一个存档文件中)。示例代码:tarfile.open(fileobj=byte_stream, mode='r:gz') - Alex
2
完全正确。我已经到了fileobj=file_like_object,但没有使用mode=,只是提供了不符合Python语法的模式x0(它们都是位置参数,但文档显示“文件名”,“r:gz”——如果您正在使用内存中的内容,则需要显式地使用fileobj=...,mode=... - svenevs

11
当然,就像这样:
import io

io_bytes = io.BytesIO(byte_array)

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

(根据您的tar文件格式调整mode,例如可能是`mode='r:gz'等)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接