Скачайте и распакуйте tar-файл в Python кусками

1

Я пытаюсь использовать pycurl чтобы загрузить файл tgz и извлечь его с помощью tarfile, но не сохраняя файл tgz на диске и не имея всего tgz файла в памяти. Я хотел бы загрузить его и извлечь его в куски, потоковые.

Я знаю, как получить обратный вызов pycurl, который дает мне данные каждый раз, когда загружается новый кусок данных:

def write(data):
    # Give data to tarfile to extract.
    ...

with contextlib.closing(pycurl.Curl()) as curl:
    curl.setopt(curl.URL, tar_uri)
    curl.setopt(curl.WRITEFUNCTION, write)
    curl.setopt(curl.FOLLOWLOCATION, True)
    curl.perform()

Я также знаю, как открыть tarfile в потоковом режиме:

output_tar = tarfile.open(mode='r|gz', fileobj=fileobj)

Но я не знаю, как соединить эти две вещи вместе, так что каждый раз, когда я получаю кусок по проводу, извлекается следующий фрагмент файла tar.

  • 0
    msgstr "скачать файл tgz и распаковать его (...), но не сохраняя ничего на диске и не имея всего файла tgz в памяти" => Err, я не уверен, что это вообще возможно.
  • 0
    Я обновил язык. Но да, это возможно. curl tar_uri | tar -xz делает это вне Python. Как я могу сделать это в Python?
Показать ещё 4 комментария
Теги:

1 ответ

0

Если честно, если вы действительно ищете решение с чистым Python (это возможно, довольно утомительно), я бы предложил просто выложить в /usr/bin/tar и передать данные в куски.

Что-то вроде

import subprocess
p = subprocess.Popen(['/usr/bin/tar', 'xz', '-C', '/my/output/directory'], stdin=subprocess.PIPE)

def write(data):
    p.stdin.write(data)

with ...:
    curl.perform()

p.close()
  • 0
    Да, это также то, что я думал как обходной путь. Это бы сработало, но мне было интересно, как это сделать на чистом Python. В ноде я просто собрал бы все вместе, но в Python это кажется намного сложнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню