У меня есть 'tafile', который содержит файлы с полным путем '/home/usr/path/to/file'. Когда я извлекаю файл в текущую папку, он рекурсивно создает полный путь. Есть ли способ, чтобы я мог извлечь файл только с базовым именем.
Используйте TarFile.extractfile()
и запишите его в файл по вашему выбору.
Вы можете изменить 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 ', а не только его члены.
Вы можете использовать функцию extractall
в соответствии с вашими потребностями. Согласно документации:
Извлеките всех членов из архива в текущий рабочий каталог или путь к каталогу.
TarFile.extractall(path="my/path")
shutil.copyfileobj
- это удобный инструмент для копирования.