我正在尝试从网络上获取一个大文件,并将其直接流式传输到zipfile
模块提供的zipfile写入器中,类似于以下代码:
from urllib.request import urlopen
from zipfile import ZipFile
zip_file = ZipFile("/a/certain/local/zip/file.zip","a")
entry = zip_file.open("an.entry","w")
entry.write( urlopen("http://a.certain.file/on?the=web") )
显然,这样做不起作用是因为
.write
接受一个bytes
参数,而不是I/O读取器。但是,由于文件相当大,我不想在压缩之前将整个文件加载到RAM中。简单的解决方案是使用bash(从未真正尝试过,可能有误):curl -s "http://a.certain.file/on?the=web" | zip -q /a/certain/local/zip/file.zip
但是,在Python脚本中加入一行bash代码既不优雅,也不方便。
另一个解决方案是使用urllib.request.urlretrieve
下载文件,然后将路径传递给zipfile.ZipFile.open
,但这样我仍然需要等待下载完成,而且还会消耗更多的磁盘I/O资源。
在Python中,是否有一种方法可以直接将下载流传递给zipfile写入器,就像上面的bash管道一样?
gzopen
来创建一个.gz
文件。 - Jean-François Fabregzip
,我需要使用tar
。 - busukxuan.read(size)
以块的形式获取数据。 - furasgzopen
是什么?你是指gzip.open
还是其他什么东西? - falsePockets