Python: извлечение с использованием tarfile, но игнорирование каталогов

Если у меня есть .tar файл с файлом '/path/to/file.txt', есть ли способ (в Python) извлечь файл в указанный каталог без воссоздания каталога '/path/to'?

Ответ 1

Я также встречаю эту проблему и перечисляю полный пример, основанный на ответе эхуморо

import os, tarfile
output_dir = "."
tar = tarfile.open(tar_file)
for member in tar.getmembers():
  if member.isreg():  # skip if the TarInfo is not files
    member.name = os.path.basename(member.name) # remove the path by reset it
    tar.extract(member,output_dir) # extract 

Ответ 2

Атрибуты данных объекта TarInfo доступны для записи. Поэтому просто измените name на все, что хотите, а затем извлеките его:

import sys, os, tarfile

args = sys.argv[1:]
tar = tarfile.open(args[0])
member = tar.getmember(args[1])
member.name = os.path.basename(member.name)
path = args[2] if len(args) > 2 else ''
tar.extract(member, path)

Ответ 3

В соответствии с модулем tarfile вы можете сделать это легко. Я еще не проверил его.

TarFile.extract(member, path="")

Документация:

Извлеките член из архива в текущий рабочий каталог, используя его полное имя. Его файловая информация извлекается как можно точнее. член может быть именем файла или объектом TarInfo. Вы можете указать другой каталог, используя путь.

Итак, вы должны иметь возможность делать

TarFile.extract(member, path=".")

Смотрите полную документацию по адресу: http://docs.python.org/library/tarfile.html

Ответ 4

Вы можете использовать TarFile.extractfile(member) для извлечения определенного файла.

Он возвращает файл файл (типичный Python), который затем можно использовать для записи содержимого в файл в любом месте, которое вы хотите.

Ответ 5

Если вам нужны только файлы определенного типа (например,.xml или .html), вы можете проверить item.name.endswith('xml'). Просто чтобы соответствовать предыдущим примерам:

import os, tarfile
tarfilename = <your_tar_file>
exitfolder = "." #your path

tar = tarfile.open(tar_file, 'r:gz') # open a .tar.gz file i.e.
for item in tar:
  if item.name.endswith('xml'):  # getting only xml extensions
    item.name = os.path.basename(item.name) # remove the path
    tar.extract(item,exitfolder) # extract