Извлечь только один каталог из tar - PullRequest
9 голосов
/ 04 ноября 2011

Я работаю над проектом на python, в котором мне нужно извлечь только подпапку архива tar, а не все файлы.Я пытался использовать

tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)

Но это не работает, он не извлекает данный подкаталог, и не выдается исключение.Я новичок в питоне.Также, если вышеуказанная функция не работает для каталогов, в чем разница между этой командой и tar.extractfile ()?

Ответы [ 2 ]

14 голосов
/ 04 ноября 2011

Основываясь на втором примере из документации модуля tarfile , вы можете извлечь вложенную подпапку и все ее содержимое примерно так:

with tarfile.open("sample.tar") as tar:
    subdir_and_files = [
        tarinfo for tarinfo in tar.getmembers()
        if tarinfo.name.startswith("subfolder/")
    ]
    tar.extractall(members=subdir_and_files)

Создает список подпапок и их содержимое, а затем использует рекомендуемый метод extractall() для извлечения только их. Конечно, замените "subfolder/" фактическим путем (относительно корня файла tar) подпапки, которую вы хотите извлечь.

6 голосов
/ 29 марта 2017

В другом ответе будет сохранен путь к подпапке, что означает, что subfolder/a/b будет извлечено в ./subfolder/a/b.Чтобы извлечь подпапку в корень, чтобы subfolder/a/b было извлечено в ./a/b, вы можете переписать пути примерно так:

def members(tf):
    l = len("subfolder/")
    for member in tf.getmembers():
        if member.path.startswith("subfolder/"):
            member.path = member.path[l:]
            yield member

with tarfile.open("sample.tar") as tar:
    tar.extractall(members=members(tar))
...