#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 — ваш метод сработал, и вы должны опубликовать его в качестве ответа. Спасибо!