Извлечение файла из tarfile только с базовым именем с использованием Python

1

У меня есть 'tafile', который содержит файлы с полным путем '/home/usr/path/to/file'. Когда я извлекаю файл в текущую папку, он рекурсивно создает полный путь. Есть ли способ, чтобы я мог извлечь файл только с базовым именем.

Теги:
tarfile

3 ответа

1
Лучший ответ

Используйте TarFile.extractfile() и запишите его в файл по вашему выбору.

  • 0
    Это решение, но я бы предпочел переименовать файл, а не копировать каждую строку.
  • 0
    Вы не можете не копировать каждую строку, так как это происходит извлечение. shutil.copyfileobj - это удобный инструмент для копирования.
0

Вы можете изменить arcnames, взломав объекты TarInfo, которые вы получаете из Tarfile.getmembers(). Затем вы можете использовать Tarfile.extractall для записи членов в выбранное вами место назначения под их новыми именами.

Например, следующая функция будет выбирать элементы из произвольного поддерева архива и извлекать их в пункт назначения под их базовыми именами:

def extractTo(tar, dest, selector):
    if type(selector) is str:
        prefix = selector
        selector = lambda m: m.name.startswith(prefix)
    members = [m for m in tar.getmembers() if selector(m)]
    for m in members:
        m.name = os.path.basename(m.name)
    tar.extractall(path = dest, members = members)

Предположим, что tar является экземпляром TarFile, представляющим архив с некоторыми членами в каталоге utilities/misc, и вы хотели бы свернуть эти члены в каталог local/bin. Вы можете сделать:

extractTo(tar, 'local/bin', 'utilities/misc/')

Обратите внимание на конечный / в префиксе каталога. Мы не хотим добавлять каталог misc в `local/bin ', а не только его члены.

0

Вы можете использовать функцию extractall в соответствии с вашими потребностями. Согласно документации: Извлеките всех членов из архива в текущий рабочий каталог или путь к каталогу.

TarFile.extractall(path="my/path")
  • 0
    «Tarfile» не создается мной. Есть ли способ изменить имя дуги после создания файла tarfile?
  • 0
    Да, извините, это то, что я осознал после более внимательного прочтения! Пожалуйста, смотрите мои изменения, они должны лучше соответствовать вашим потребностям.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню