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

Sef*_*efu 21 python file tar tarfile python-3.x

是否可以使用包含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)
Run Code Online (Sandbox Code Playgroud)

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

感谢您的帮助!

小智 30

来自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)
Run Code Online (Sandbox Code Playgroud)

  • 可能必须添加模式,具体取决于您正在执行的操作(在存档中存档)tarfile.open(fileobj = byte_stream,mode ='r:gz') (2认同)
  • ^正好。我已经去了`fileobj = file_like_object`并且没有做`mode =`只是给出了无效的python x0模式(它们都是位置参数,但是文档显示`“ filename”,“ r:gz “`-如果您正在使用内存中的内容,则需要显式地`fileobj = ...,mode = ...`! (2认同)

War*_*ser 7

当然,是这样的:

import io

io_bytes = io.BytesIO(byte_array)

tar = tarfile.open(fileobj=io_bytes, mode='r')
Run Code Online (Sandbox Code Playgroud)

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