我正在运行一个WSGI服务器,我写的部分API会返回一些(相当大的)文件以及有关它们的元数据。我想将文件tar / gzip一起保存带宽,因此只需要下载一个文件。由于WSGI允许您返回一个可迭代对象,因此我想返回一个iterable,它返回生成的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"))
答案 0 :(得分:2)
bz2模块提供顺序压缩。似乎zlib包也可以按顺序压缩数据。所以使用这些模块你可以:
AFAIK Python的tar-API不支持顺序tar'ing(如果我错了,请纠正我)。但是如果你的文件太大而你需要按顺序tar,你可以使用subprocess模块在命令行上运行tar
并以块的形式读取它的标准输出。在这种情况下,您还可以使用tar
命令压缩数据。然后你只需要阅读子进程的标准输出并产生读取块。