Я пытаюсь получить большой файл из Интернета и передать его прямо в zip-файл, предоставляемый модулем zipfile
, что-то вроде:Передача файла-подобного объекта методу write() другого файлового объекта
from urllib.request import urlopen
from zipfile import ZipFile
zip_file = ZipFile("https://stackoverflow.com/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
аргумент, а не считывающее устройство ввода/вывода. Однако, поскольку файл довольно большой, я не хочу загружать весь файл в ОЗУ, прежде чем сжимать его.
Простое решение заключается в использовании Баша (никогда не пробовал, может быть неправильно):
curl -s "http://a.certain.file/on?the=web" | zip -q /a/certain/local/zip/file.zip
, но это будет не очень элегантно, и удобно, что нужно поставить одну строку Баша в скрипт Python.
Другим решением является использование urllib.request.urlretrieve
, чтобы загрузить файл, а затем передать путь до zipfile.ZipFile.open
, но в этом случае мне все равно придется дождаться завершения загрузки и, кроме того, также потреблять намного больше ресурсов ввода-вывода на диске ,
Есть ли способ в Python передать поток загрузки в zipfile-писатель, например, в bash-конвейер выше?
У вас есть некоторые альтернативы, такие как 'gzopen' для создания файла .gz. –
@ Jean-FrançoisFabre Мне нужен архив, поэтому в этом случае мне понадобится «tar», если я хочу использовать 'gzip'. – busukxuan
вы можете использовать '.read (size)' для получения данных в chunk – furas