#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’.