37

是否可以使用包含 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)

注意:这样做的原因之一是我们最终希望能够同时使用多个线程执行此操作,因此如果两个线程尝试同时执行此操作,则可能会覆盖使用临时文件。

感谢您的任何帮助!

4

2 回答 2

50

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)
于 2013-04-07T02:30:36.477 回答
10

当然,像这样:

import io

io_bytes = io.BytesIO(byte_array)

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

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

于 2013-04-07T02:17:47.883 回答