gpt4 book ai didi

python - 如何从生成器读取 tarfile?

转载 作者:太空狗 更新时间:2023-10-29 21:56:24 27 4
gpt4 key购买 nike

Create a zip file from a generator in Python?描述了将一堆文件写入 .zip 到磁盘的解决方案。

我在相反的方向也有类似的问题。我得到了一个发电机:

stream = attachment.iter_bytes()
print type(stream)

我很乐意将其通过管道传输到类似 tar gunzip 文件的对象:

b = io.BytesIO(stream)
f = tarfile.open(mode='r:gz', fileobj = b)
f.list()

但我不能:

<type 'generator'>
Error: 'generator' does not have the buffer interface

我可以像这样在 shell 中解决这个问题:

$ curl --options http://URL | tar zxf - ./path/to/interesting_file

在给定条件下,我如何在 Python 中执行相同的操作?

最佳答案

我必须将生成器包装在一个构建在 io 之上的类似文件的对象中模块。

def generator_to_stream(generator, buffer_size=io.DEFAULT_BUFFER_SIZE):
class GeneratorStream(io.RawIOBase):
def __init__(self):
self.leftover = None

def readable(self):
return True

def readinto(self, b):
try:
l = len(b) # : We're supposed to return at most this much
chunk = self.leftover or next(generator)
output, self.leftover = chunk[:l], chunk[l:]
b[:len(output)] = output
return len(output)
except StopIteration:
return 0 # : Indicate EOF
return io.BufferedReader(GeneratorStream())

有了它,您可以打开 tar 文件并提取其内容。

stream = generator_to_stream(any_stream)
tar_file = tarfile.open(fileobj=stream, mode='r|*')
#: Do whatever you want with the tar_file now

for member in tar_file:
member_file = tar_file.extractfile(member)

关于python - 如何从生成器读取 tarfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39155958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com