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

#python #tarfile

#python #tarfile

Вопрос:

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

Ответ №1:

Вы можете изменить, 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’, скорее, только его элементы.

Ответ №2:

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

Комментарии:

1. Это решение, но я бы предпочел переименовать файл вместо копирования каждой строки.

2. Вы не можете не «копировать каждую строку», поскольку именно так выполняется извлечение. shutil.copyfileobj это удобный инструмент для самостоятельного копирования.

Ответ №3:

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

 TarFile.extractall(path="my/path")
  

Комментарии:

1. ‘tarfile’ создается не мной. Есть ли способ изменить arcname после создания tarfile?

2. Да, извините, это то, что я узнал после более внимательного чтения ! Пожалуйста, посмотрите мою правку, она должна лучше соответствовать вашим потребностям.

3. Он по-прежнему создает папки рекурсивно, как в ‘my/ path//home/usr/path/to/file’.