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

Posted

技术标签:

【中文标题】如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?【英文标题】:How to construct a TarFile object in memory from byte buffer in Python 3? 【发布时间】:2013-03-29 06:39:07 【问题描述】:

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

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

感谢您的所有帮助!

【问题讨论】:

【参考方案1】:

来自IO module 的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)

【讨论】:

可能需要添加模式,具体取决于您在做什么(存档中的存档)tarfile.open(fileobj=byte_stream, mode='r:gz') ^ 完全正确。我已经到达fileobj=file_like_object 并没有做mode= 只是给出无效的python x0 模式(它们都是位置参数,但文档显示"filename", "r:gz" - 如果你使用的东西来自您需要明确fileobj=..., mode=... 的内存!【参考方案2】:

当然,是这样的:

import io

io_bytes = io.BytesIO(byte_array)

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

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

【讨论】:

以上是关于如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中从十六进制(字节字符串)中读取单个字符?

在纯 WinAPI 中从内存缓冲区播放声音

Python 可写缓冲区/内存视图到数组/字节数组/ctypes 字符串缓冲区

文件流之字节缓冲流(BufferedInputStream BufferedOutputStream)

Java 流(Stream)文件(File)和IO -- Java ByteArrayOutputStream类

如何执行汇编操作码而不将其存储到缓冲区 c/python 中?