Извлечь все файлы с путем к каталогу в заданном каталоге

У меня есть tar-архив, в котором есть каталог, который мне нужно извлечь в заданный каталог. Например: у меня есть каталог

TarPrefix/x/y/z

в tar-архиве я хочу извлечь его в указанный целевой каталог, например: extracted/a/ этот каталог должен содержать все файлы и каталоги, содержащиеся в каталоге TarPrefix/x/y/z.

subdir_and_files = [  tarinfo for tarinfo in tar.getmembers()
                      if tarinfo.name.startswith("subfolder/")
                   ]

чтобы получить список всех членов в пути к каталогу «подпапка/», а затем я извлекаю его, используя tar.extractall(extracted/a,subdir_and_files), но он извлекает всех членов с их путем к каталогу. Например, это приводит к извлечению /a/x/y/z. Не могли бы вы помочь мне в извлечении этих файлов в данной папке.


person gaurav    schedule 24.11.2011    source источник
comment
Я не знаю, но этот вопрос кажется противоположным вашему: stackoverflow.com/questions/2239655/ Возможно, вы можете использовать extract() вместо extractall() и посмотреть, что вы можете сделать, возможно, изменив объекты TarInfo вы попали в subdir_and_files?   -  person John Zwinck    schedule 24.11.2011
comment
Извините, что задаю вопрос новичка. Я новичок в питоне и не нашел ответа в гугле, поэтому и задал такой вопрос. Чтобы помочь другим, я хочу ответить на этот вопрос. Вам просто нужно изменить значение атрибута tarinfo.name на правильное значение. то есть в моем примере tarinfo.name=tarinfo.name[len(Tarprefix/x/y/z):], а затем работает тот же код.   -  person gaurav    schedule 24.11.2011
comment
Я попытался ответить на свой вопрос, но мне не разрешают до восьми часов, поэтому я ждал до тех пор.   -  person gaurav    schedule 24.11.2011
comment
Я думаю, что ответ не прост, то, как это [tarlib] сделано, не очень хорошо (tarinfo говорит об объекте в архиве, а не об извлеченном объекте). Я думаю, что это должно быть лучше API для извлечения материала (например, команда tar имеет параметр --strip-components)   -  person spinus    schedule 15.01.2013


Ответы (2)


Похоже, вы, возможно, уже нашли ответ, но в любом случае вот моя версия:

import sys, tarfile

def get_members(tar, prefix):
    if not prefix.endswith('/'):
        prefix += '/'
    offset = len(prefix)
    for tarinfo in tar.getmembers():
        if tarinfo.name.startswith(prefix):
            tarinfo.name = tarinfo.name[offset:]
            yield tarinfo

args = sys.argv[1:]

if len(args) > 1:
    tar = tarfile.open(args[0])
    path = args[2] if len(args) > 2 else '.'
    tar.extractall(path, get_members(tar, args[1]))
person ekhumoro    schedule 24.11.2011
comment
Спасибо за помощь. Я нашел ответ, экспериментируя с вещами :). В любом случае большое спасибо. - person gaurav; 25.11.2011

person    schedule
comment
опишите что-нибудь о своем ответе. - person Satendra; 01.12.2017