Чтение содержимого файла RAR в память в Python

Я ищу способ чтения определенных файлов из архива rar в память. В частности, это коллекция пронумерованных файлов изображений (я пишу комический ридер). Хотя я могу просто unrar эти файлы и загрузить их по мере необходимости (удаление их, когда сделано), я бы предпочел избежать этого, если это возможно.

все сказанное, я бы предпочел решение, которое является кросс-платформенным (Windows/Linux), если это возможно, но Linux является обязательным. Так же важно, если вы собираетесь указать на библиотеку, чтобы ручка это для меня, пожалуйста, поймите, что это должно быть бесплатно (как в пиве) или ОСС.

7 ответов


реальный ответ заключается в том, что библиотеки нет, и вы не можете ее сделать. Вы можете использовать rarfile, или вы можете использовать 7zip unRAR (который менее свободен, чем 7zip, но все еще свободен, как в beer), но оба подхода требуют внешнего исполняемого файла. Лицензия на RAR в основном требует этого, так как, хотя вы можете получить исходный код для unRAR, вы не можете изменить его каким-либо образом, и превращение его в библиотеку будет представлять собой незаконную модификацию.

кроме того, solid RAR archives (лучший сжатый) доступ к нему не может быть случайным, так что вам все равно придется разархивировать все. WinRAR представляет пользовательский интерфейс, который, похоже, избегает этого, но на самом деле это просто распаковка и переупаковка архива в фоновом режиме.



похоже, что ограничение, которое rarsoft накладывает на производные работы, заключается в том, что вы не можете использовать исходный код unrar для создания вариации RAR сжатие. Из контекста может показаться, что он специально позволяет людям использовать его код (измененный или нет) для распаковки файлов, но вы не можете использовать их, если собираетесь написать свой собственный код сжатия. Вот прямая цитата из лицензии.txt файл, который я скачал:

  1. в Источники UnRAR могут использоваться в любом программном обеспечении для обработки RAR архивы без ограничений бесплатны, но не могут быть использованы для повторного создания алгоритма сжатия RAR, который является собственностью. Распределение модифицированных источников UnRAR в отдельной форме или в виде частью другого программного обеспечения, при условии, что это четко указано в документации и комментариях источника, что код может не использоваться для разработки совместимого с RAR (WinRAR) архиватора.

видя, как все казалось, просто нужно что-то, что позволило бы им написать комический просмотрщик, способный обрабатывать изображения чтения из файлов CBR (rar), я не понимаю, почему люди думают, что что-то мешает им использовать предоставленный исходный код.


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

вам намного лучше использовать ZIP; это совершенно бесплатно, имеет точную общедоступную спецификацию, библиотека сжатия доступна везде (zlib-одна из самых широко развернутых библиотек в мире), и ее очень легко кодировать.

http://docs.python.org/library/zipfile.html


на pyUnRAR2 библиотека может извлекать файлы из архивов RAR в память (и диск, если вы хотите). Он доступен под лицензией MIT и просто обертывает UnRAR.dll в Windows и unrar в Unix. Нажмите "QuickTutorial" для примеров использования.

в Windows он может извлекать в память (а не на диск) с помощью (включенного) UnRAR.dll путем установки обратного вызова с помощью RARSetCallback() , а затем вызова RARProcessFile () с параметром RAR_TEST вместо параметра RAR_EXTRACT чтобы избежать извлечения файлов на диск. Обратный вызов затем наблюдает за событиями UCM_PROCESSDATA для чтения данных. Из документации по событиям UCM_PROCESSDATA: "обработать распакованные данные. Он может использоваться для чтения файла во время его извлечения или тестирования без фактического извлечения файла на диск."

в Unix unrar может просто распечатать файл в stdout, поэтому библиотека просто читает из трубы, подключенной к stdout unrar. Unrar binary вам нужен тот, который имеет "p" для " Print команда "файл в stdout". Используйте "apt-get install unrar", чтобы установить его на Ubuntu.


на в 7-Zip бесплатная библиотека также способен обрабатывать файлы RAR.


посмотрите на модуль Python "struct". Затем вы можете интерпретировать формат файла RAR непосредственно в своей программе Python, позволяя вам извлекать содержимое внутри RAR без зависимости от внешнего программного обеспечения, чтобы сделать это за вас.

EDIT: это, конечно, vanilla Python - есть альтернативы, которые используют сторонние модули (как уже опубликовано).

EDIT 2: Согласно Википедии мой ответ потребует от вас разрешения от автор.