LINUX.ORG.RU

Как в Python работать с определённым каталогом в .xz файле?

 , , ,


2

2

Есть .xz

Питон прекрасно его открывает, работает с файлом в корневом каталоге.

Т.е. tar = tarfile.open(name='archive.xz', mode='r:xz'), в этом архиве есть file - к нему вопросов нет. Читается, парсится, операции над ним совершаются.

Однако, нужно получить доступ к файлам в дочернем каталоге в архиве.

Гуглил, читал документацию - предлагают только распаковать. А вот распаковывать очень не желательно.

ну такое чтоб побыcтрее:

import os

file_path = os.path.join(os.getcwd(), 'your_catalog', archive.xz)

tar = tarfile.open(name=file_path, mode='r:xz')

os.getcwd() # путь откуда запускается скрипт

sniper21 ★★★★★
()
Ответ на: комментарий от Mamin_simpotyaga

Метаданные и сами файлы записанные друг за другом. Имя каталога — это просто составная часть имени файла. Здесь подробнее: https://www.gnu.org/software/tar/manual/html_node/Standard.html

А xz просто жмёт поток, про его содержимое ему ничего не известно. Я не очень понял что именно ты делаешь, но ты так и так всё извлекаешь, только в оперативу.

WitcherGeralt ★★
()

как тебе уже сказали, .tar.* архивы неинтерактивны, то есть их нельзя менять динамически, они на это не рассчитаны. алгоритм сжатия (в твоём случае xz) ничего не знает об иерархии файлов в архиве, а сам tar (упаковщик) - хоть и знает о том, что при распаковке файлы следует сложить в иерархию файлов и каталогов, не рассчитан на динамическое изменение. так что единственный способ модификации таких архивов - полная распаковка, внесение изменений, запаковка. ты это всё сейчас делаешь в оперативке, так почему бы явным образом не сделать то же самое на диске?

eternal_sorrow ★★★★★
()
Ответ на: комментарий от Mamin_simpotyaga

Там пути. Можно считать, что тар - это единственный каталог с файлами ааа, ббб/ввв, ггг/ддд, ггг/еее, ггг/жжж/ззз и т.д.

legolegs ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Не мой случай, но всё же - а если .xz весит под гигабайт, а нужно всего-то выдернуть из него пару строчек - тоже надо распаковывать? :)

Mamin_simpotyaga
() автор топика
Ответ на: комментарий от Mamin_simpotyaga

Не обязательно целиком, но это от конкретной реализации зависит. Если файл, который надо нужно извлечь, находится в самом начале, можно извлечь только его, не распаковывая весь архив. Если вдруг тебе нужно, могу дать пример на плюсах.

WitcherGeralt ★★
()

Ну можно взять какой-нибудь dar, который умеет файлы извлекать не считывая всё. Ещё можно прикрутить индексы к обычному скажем gz, обычный тар этого не делает только с патчами. Но вот изменить? Тар изменить разве что добавив новую версию в конец, старая из архива никуда не денется.

anonymous
()

И почему связка tar.gz|bz2|xz|etc до сих пор так популярна? Tar старьё же ужасное и вообще для магнитной ленты...

ls-h ★★★★★
()
Последнее исправление: ls-h (всего исправлений: 1)
Ответ на: комментарий от ls-h

Потому что работает и будет работать через 50 лет. Все эти зипы с рарами регулярно ломают, уже есть пример всяких arj которые хрен распакуешь спустя всего какие-то 10 лет.

anonymous
()
Ответ на: комментарий от ls-h

1. Простой.
2. Потоковый.
3. Открытый.
4. Работал, работает и будет работать.

Да и идеологически правильно разделать архиватор и компрессоры.

karaien ★★
()

Запили свой формат, где файлы будут сжиматься независимо. Это конечно понизит степень сжатия, но зато любой файл в гигабайтовом архиве тебе доступен без распаковки всего. Не стесняйся велосипедить свои форматы. Можешь в sqlite положить даже.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Используйте 7z, там тот же lzma. С выключенной опцией solid можно работать с отдельными файлами и каталогами

ism ★★★
()
Последнее исправление: ism (всего исправлений: 1)

Однако, нужно получить доступ к файлам в дочернем каталоге в архиве.

получи список через getnames() и выбери те, что с нужного каталога начинаются.

monk ★★★★★
()
Ответ на: комментарий от Mamin_simpotyaga

7z плохо подходит для скриптового использования, всякие tar'ы и xz в сто раз удобнее.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.