Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python 3中从字节缓冲区构造内存中的TarFile对象?_Python_File_Python 3.x_Tar_Tarfile - Fatal编程技术网

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

如何在Python 3中从字节缓冲区构造内存中的TarFile对象?,python,file,python-3.x,tar,tarfile,Python,File,Python 3.x,Tar,Tarfile,是否可以使用包含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数据的缓冲区在内存中创建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)
import io

io_bytes = io.BytesIO(byte_array)

tar = tarfile.open(fileobj=io_bytes, mode='r')
注意:这样做的原因之一是,我们最终希望能够同时使用多个线程执行此操作,因此,如果两个线程试图同时执行此操作,则可能会覆盖使用临时文件


谢谢你的帮助

当然,是这样的:

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)
import io

io_bytes = io.BytesIO(byte_array)

tar = tarfile.open(fileobj=io_bytes, mode='r')
(调整
mode
以适合tar文件的格式,例如可能的'mode='r:gz'等)

BytesIO()from正好满足您的需要

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\u like\u object
,而不是
mode=
,只是给出了一个无效的pythonx0模式(它们都是位置参数,但是文档显示
“filename”,“r:gz”
——如果你使用的是内存中的东西,你需要显式地
fileobj=…,mode=…