将文件合并在一起在Python中可迭代吗?

问题描述

| 我正在运行Wsgi服务器,并且正在编写的API的一部分将返回一些(相当大的)文件以及有关它们的元数据。我想将文件tar / gzip在一起以节省带宽,因此只需要下载一个文件。由于Wsgi允许您返回一个可迭代的对象,因此我想返回一个可迭代的对象,该对象在生成tar.gz文件时会返回其块。 我的问题是,用将输出流回给用户的方式在Python中将tar / gzip文件在一起的一种好方法是什么? 编辑: 为了在下面详细说明我对Oben Sonne的回复,我将具有以下功能
def iter_file(f,chunk=32768): return iter(lambda: f.read(chunk),\'\')
这将让我指定将文件返回到Wsgi服务器时从文件返回的块大小。 那么,这很简单:
return iter_file(subprocess.Popen([\"tar\",\"-Ocz\"] + files,stdout=subprocess.PIPE).stdout)
或者,如果我想返回文件
return iter_file(open(filename,\"rb\"))
    

解决方法

        bz2模块提供顺序压缩。而且似乎zlib包也可以按顺序压缩数据。因此,使用这些模块,您可以: tar您的文件(不要花那么长时间), 以二进制模式迭代读取存档, 将读取的块传递给顺序压缩函数,然后 产生这些函数的压缩输出,因此可能被其他某些组件(WSGI)迭代使用 AFAIK Python的tar-API不支持顺序taring(如果我输入错了,请纠正我)。但是,如果文件太大,以至于您真的需要按顺序进行tar,则可以使用子进程模块在命令行上运行
tar
,并分块读取其标准输出。在这种情况下,您也可以使用
tar
命令压缩数据。然后,您只需要读取子流程的标准输出并产生读取的块即可。