7
votes

Lire le contenu du fichier RAR dans la mémoire en Python

Je cherche un moyen de lire des fichiers spécifiques d'une archive RAR dans la mémoire. Spécifiquement, ils sont une collection de fichiers image numérotés (j'écris un lecteur de bande dessinée). Bien que je puisse simplement dégarmer ces fichiers et chargez-les au besoin (supprimez-les lorsque vous avez terminé), je préférerais éviter cela si possible.

Tout cela dit, je préférerais une solution dans la plate-forme transversale (Windows / Linux) si possible, mais Linux est un must. Tout comme surtout, si vous allez signaler une bibliothèque pour me gérer pour moi, veuillez comprendre qu'il doit être libre (comme dans la bière) ou OSS.


0 commentaires

7 Réponses :


9
votes

3 commentaires

Oui, j'étais sur le point de poster ceci. Bien que l'OP puisse avoir juste Googled "Python Rar" ...


Malheureusement, vous n'avez toujours besoin que de ceci pour que cela fonctionne - c'est juste une API agréable à gérer une utilité externe.


@kiv dans ma défense, j'ai fait en fait google similaire mais a trouvé principalement des informations sur la bibliothèque de Chilkat. Il semble également que Rarfile repose toujours sur Unlar.



0
votes

Regardez le module Python "STREST". Vous pouvez ensuite interpréter le format de fichier RAR directement dans votre programme Python, vous permettant de récupérer le contenu à l'intérieur du rar sans dépendre du logiciel externe pour le faire pour vous.

EDIT: Ceci est bien sûr vanillé python - il existe des alternatives qui utilisent des modules tiers (comme déjà posté).

Edit 2: Selon Article de Wikipedia Ma réponse vous obligerait à avoir la permission de la Auteur.


4 commentaires

Je pense que cela vous met probablement dans un territoire juridique trouble. (Je soupçonne que ce que Rarfile est la limite de ce que vous êtes autorisé à faire sans licence RAR).


@Glenn Je l'ai bien peur, ou du moins c'est ce que Google m'a dit.


Google ne m'a rien dit et les notifications légales de ma copie de RAR de Linux n'ont que des avis de droit d'auteur.


J'ai édité ma réponse pour ajouter un lien à l'entrée de Wikipedia sur RAR. Il semble que vous devez avoir la permission de l'auteur, mais cela ne ferait pas mal de demander aux développeurs d'obtenir une réponse concluante ( rarlab.com/feedback.htm , section de vente).



0
votes

the Libre 7zip Library est également capable de gérer les fichiers RAR.


2 commentaires

Est-il capable de les charger en mémoire en utilisant Python? 7ZIP est bon, mais je ne suis pas sûr qu'il réponde à la question.


@KIV: C'est aussi capable que Rarfile est, vraiment, puisque vous pouvez simplement utiliser SubProcess.Popen pour gérer le fichier.



5
votes

La vraie réponse est qu'il n'y a pas une bibliothèque et vous ne pouvez pas en faire un. Vous pouvez utiliser RARFILE, ou vous pouvez utiliser 7ZIP UNRAR (qui est moins libre que 7ZIP, mais toujours libre comme dans la bière), mais les deux approches nécessitent un exécutable externe. La licence pour RAR l'exige essentiellement, comme si vous pouvez obtenir un code source pour UNRAR, vous ne pouvez en aucun cas modifier, et la transformer en une bibliothèque constituerait une modification illégale.

Aussi, les archives RAR solides (les meilleures comprimées) ne peuvent pas être accessibles au hasard, vous devez donc vous absorber toute la chose. WinRar présente une interface utilisateur qui semble éviter cela, mais il s'agit vraiment de déballage et de remballage des archives à l'arrière-plan.


2 commentaires

On dirait que je vais juste devoir appeler UNRARN et extraire dans un répertoire temporaire pour être utilisé et nettoyez-le lorsque vous avez terminé. Merci!


Bien sûr, vous pouvez en faire un, mais vous devrez inverser l'ingénieur, le format, et c'est une cible en mouvement (le format a changé au fil des ans). Cela ne vaut probablement pas la peine, mais j'ai vu des applications (exclusives) qui le font.



1
votes

rar est un format exclusif; Je ne pense pas qu'il y ait des spécifications publiques, un outil de bibliothèque et une bibliothèque tiers sont donc pauvres à des non-existants.

Vous êtes beaucoup mieux à l'aide de zip; C'est totalement gratuit, dispose d'une spécification publique précise, la bibliothèque de compression est disponible partout (ZLIB est l'une des bibliothèques les plus largement déployées au monde) et il est très facile de coder.

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


1 commentaires

Bien que je conviens que Zip est un bon format pour cela, il n'est malheureusement que l'un des deux formats courants utilisés pour la distribution de bandes dessinées, rar étant l'autre. J'ai besoin de soutenir les deux.



3
votes

Le La bibliothèque PYUNRAR2 peut extraire des fichiers des archives RAR en mémoire (et disque si tu veux). Il est disponible sous licence MIT et enveloppe simplement UNRARD.DLL sous Windows et Unlar sur UNIX. Cliquez sur "QuickTutorial" pour des exemples d'utilisation.

sur Windows, il est capable d'extraire en mémoire (et pas de disque) avec le (inclus) non -.dll en définissant un rappel à l'aide de RarsetCallback (), puis appelez RARProcessfile () avec l'option RAR_TEST au lieu de l'option RAR_TEXT Évitez d'extraire des fichiers sur le disque. Le rappel montre ensuite les événements UCM_ProcessData pour lire les données. De la documentation des événements UCM_PROCESSDATA: "Processus Données décompressées. Il peut être utilisé pour lire un fichier lorsqu'il est extrait ou testé sans extraction réelle du fichier sur disque."

sur UNIX, UNRART peut simplement imprimer le fichier à STDOUT, la bibliothèque se lit plus qu'à partir d'un tuyau connecté au stdout d'UNRAR. Le Binary Unlar Binary Vous avez besoin est celui qui possède le «P» pour la commande «PRINT FILE TO STDOUT» ». Utilisez "apt-get Installer UNRAR" pour l'installer sur Ubuntu.


0 commentaires

2
votes

On dirait que la limitation que Rarsoft impose sur des travaux dérivés est que vous ne pouvez pas utiliser le code source UNLAR pour créer une variation de l'algorithme RAR Compression . Du contexte, il semblerait que cela permettrait d'utiliser spécifiquement les personnes d'utiliser son code (modifié ou non) pour décompresser des fichiers, mais vous ne pouvez pas les utiliser si vous souhaitez écrire votre propre code de compression. Voici une citation directe du fichier license.txt que je viens de télécharger:

  1. Les sources d'UNRAR peuvent être utilisées dans n'importe quel logiciel pour gérer RAR. Archives sans limitations gratuitement, mais ne peut pas être utilisé Pour recréer l'algorithme de compression RAR, qui est propriétaire. Distribution de sources d'inauguration modifiées sous forme distincte ou en tant que une partie d'un autre logiciel est autorisée, à condition qu'il soit clairement indiqué dans la documentation et les commentaires de la source que le code peut ne pas être utilisé pour développer un archiveur compatible RAR (WinRar).

    Voir comme tout le monde semblait vouloir simplement vouloir quelque chose qui leur permettrait d'écrire un spectateur comique capable de manipuler des images de lecture des fichiers CBR (RAR), je ne vois pas pourquoi les gens pensent qu'il y a quelque chose qui les empêche d'utiliser le code source fourni. .


2 commentaires

Pour me suivre, j'ai remarqué que les archives de code source UNRAR peuvent réellement compiler à la fois libunrar.dll ainsi que libunrar.so. Vous utiliseriez la ligne de commande: faire -f makefile.unix lib


Juste pour voir ce qui se passerait, j'ai changé le code.google.com/p/py-unrar2 LIB énumérés ci-dessous pour utiliser libunrar.so que j'ai construit sur ma boîte OSX. Je devais juste changer 3 ou 4 choses sur Windows.py, comme Remplacer les bits qui ont fait référence à des types de données Windows avec les CTYPES standard et changez pour rechercher mon fichier .dll .dll. L'un des tests semble également segfault (semble être le rappel du mot de passe). Je verrai si je peux comprendre ce morceau.