Возможно ли извлечь один файл из пакета tar в python

Мне нужно получить пару файлов из огромного репозитория svn. Целая репо занимает почти час, чтобы ее можно было получить. Файлы, которые я ищу, являются частью пакета tar.

Возможно ли получить только эти два файла из пакета tar без извлечения всего пакета через Python Code?

Если да, может ли кто-нибудь сообщить мне, как мне это сделать?

Вот один из способов получить tar-файл из svn и извлечь из него один файл:

 import tarfile from subprocess import check_output # Capture the tar file from subversion tmp='/home/me/tempfile.tar' open(tmp, 'wb').write(check_output(["svn", "cat", "svn://url/some.tar"])) # Extract the file we want, saving to current directory tarfile.open(tmp).extract('dir1/fname.ext', path='dir2') 

где 'dir1 / fname.ext' – это полный путь к файлу, который вы хотите получить в архиве tar. Он будет сохранен в 'dir2 / dir1 / fname.ext'. Если вы опустите аргумент path, он будет сохранен в 'dir1 / fname.ext' в текущем каталоге.

Вышеизложенное можно понять следующим образом. В командной строке оболочки оболочки svn cat url сообщает subversion отправить файл, определенный url в stdout (см. svn help cat для получения дополнительной информации). url может быть любым типом url, который svn понимает, например svn://... , svn+ssh://... или file://... Мы запускаем эту команду под управлением python с помощью модуля подпроцесса. Для этого команда svn cat url разбивается на список: ["svn", "cat", "url"] . Результат этой команды svn сохраняется в локальном файле, определяемом переменной tmp . Затем мы используем модуль tarfile для извлечения нужного файла.

Кроме того, вы можете использовать метод extractfile для захвата данных файла в переменную python:

 handle = t.extractfile('dir1/fname.ext') print handle.readlines() # show file contents 

Согласно документации, tarfile должен принимать stdout подпроцесса как дескриптор файла. Это упростит код и устранит необходимость сохранения файла tar локально. Однако из-за ошибки, проблема 10436 , это не сработает.

Возможно, вам нужно что-то подобное?

 #!/usr/local/cpython-3.3/bin/python import tarfile as tarfile_mod def main(): tarfile = tarfile_mod.TarFile('tar-archive.tar', 'r') if False: file_ = tarfile.extractfile('etc/protocols') print(file_.read()) else: tarfile.extract('etc/protocols') tarfile.close() main() и #!/usr/local/cpython-3.3/bin/python import tarfile as tarfile_mod def main(): tarfile = tarfile_mod.TarFile('tar-archive.tar', 'r') if False: file_ = tarfile.extractfile('etc/protocols') print(file_.read()) else: tarfile.extract('etc/protocols') tarfile.close() main() 

Похоже, у вас есть две части к вашему вопросу:

  1. Извлечение единственного пакета tar из репо SVN, без остальной части файлов репо.
  2. Использование Python для извлечения двух файлов из извлеченного пакета.

В первой части я просто буду ссылаться на этот пост на svn export и на редкие проверки.

Для второй части это решение для извлечения двух файлов из загруженного tarball:

 import tarfile files_i_want = ['path/to/file1','path/to/file2'] tar = tarfile.open("bundle.tar") tar.extractall(members=[x for x in tar.getmembers() if x.name in files_i_want])