Получите имя папки «разархивировано». tar.gz файл

#python #tar

Вопрос:

У меня есть скрипт на python, который извлекает все из .tar.gz файла, а затем работает с извлеченными файлами.

Код python, который извлекает элемент, в настоящее время:

     tar = tarfile.open(input_file)
    tar.extractall(output_location)
    tar.close()
 

Где input file находится шарик, и output_location это папка, в которую я извлекаю шарик.

Тарбол создается с помощью tar -czf (output filename) (input folder) , поэтому сжатые материалы, таким образом, гарантированно находятся внутри папки, и единственным элементом верхнего уровня в тарболе будет эта папка. (Расположение вывода не обязательно пустое.) Обычно извлеченная папка имеет имя course , но теоретически ее можно назвать как угодно.

Есть ли способ узнать имя этой папки верхнего уровня до или после ее извлечения?

В противном случае я могу переименовать папку. Есть ли способ извлечь все сжатые данные из папки верхнего уровня тарбола, чтобы я мог поместить их в папку, которую я называю сам? Я мог бы распаковать все в новую папку, а затем спустить все на один уровень иерархии, и это было бы равносильно, но это похоже на стрельбу по комару из пушки.

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

1. Пожалуйста, покажите какой-нибудь код python, который иллюстрирует, как вы извлекаете эти файлы? Вы извлекаете их в память или на диск?

2. @Код-добавлен код ученика. В настоящее время я извлекаю файлы на диск. Если это имеет значение, максимальный размер выходной папки составляет около гигабайта.

Ответ №1:

Вы можете использовать os.listdir. В вашем случае возвращается список с одним элементом, элементом которого является имя нужного вам каталога.

 import os
dir_name = os.listdir(output_folder)[0]
 

или вот так, что возникает, если у вас нет ни одной записи, как ожидалось:

 dir_name, = os.listdir(output_folder)
 

Редактировать

Чтобы просто получить имена файлов/каталогов в архиве, используйте tar.getnames() . Если вы знаете, что у вас есть только один, используйте tar.getnames()[0] его .

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

1. Мои извинения; output_folder в моем вопросе указана папка, в которую я извлекаю, а не папка внутри файла tarfile. Это решение похоже на то, что оно найдет вновь созданную папку, если бы я знал ее имя, чего я не знаю. Место, в которое я извлекаю шарик, не обязательно пустое. Позвольте мне посмотреть, смогу ли я переписать для большей ясности; это сложный вопрос для написания.

2. @ColinFredericks вы можете получить имена, используя tar.getnames()

3. Похоже, это сработало! tar.getnames()[0] кажется, это папка верхнего уровня. (Хотя иногда по какой-то причине с точкой и подчеркиванием.) Опубликуйте это как ответ, чтобы я мог его выбрать.

4. Пометка @shx2 — ваш метод сработал, и вы должны опубликовать его в качестве ответа. Спасибо!