Если у меня есть .tar файл с файлом '/path/to/file.txt'
, есть ли способ (в Python) извлечь файл в указанный каталог без воссоздания каталога '/path/to'
?
Python: извлечение с использованием tarfile, но игнорирование каталогов
Ответ 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