2009-07-27 11 views
6

Szukam sposobu na odczytanie określonych plików z archiwum rar do pamięci. W szczególności są to zbiór ponumerowanych plików graficznych (piszę komiks). Chociaż mogę po prostu usunąć te pliki i załadować je w razie potrzeby (usuwając je po zakończeniu), wolałbym tego uniknąć, jeśli to możliwe.Odczytaj zawartość pliku RAR do pamięci w Pythonie

To wszystko powiedziawszy, wolałbym rozwiązanie, które jest platformą (Windows/Linux), jeśli to możliwe, ale Linux jest koniecznością. Co równie ważne, jeśli zamierzasz wskazać bibliotekę, aby sobie z tym poradzić, proszę zrozumieć, że musi być darmowa (jak w przypadku piwa) lub OSS.

Odpowiedz

4

Prawdziwą odpowiedzią jest to, że nie ma biblioteki i nie można jej utworzyć. Możesz użyć rarfile lub możesz użyć unzar 7zip (który jest mniej darmowy niż 7zip, ale nadal wolny jak w piwie), ale oba podejścia wymagają zewnętrznego pliku wykonywalnego. Licencja na RAR w zasadzie tego wymaga, ponieważ podczas gdy można uzyskać kod źródłowy dla unRAR, nie można go w żaden sposób zmodyfikować, a przekształcenie go w bibliotekę będzie stanowić nielegalną modyfikację.

Ponadto, pełne archiwa RAR (najlepiej skompresowane) nie mogą być losowo dostępne, więc i tak trzeba je całkowicie cofnąć. WinRAR przedstawia interfejs, który wydaje się tego unikać, ale tak naprawdę to tylko rozpakowywanie i przepakowywanie archiwum w tle.

+0

Wygląda na to, że będę musiał po prostu wywołać funkcję unrar i wyodrębnić do katalogu tymczasowego do użycia i wyczyścić po zakończeniu. Dzięki! –

+0

Oczywiście możesz to zrobić, ale musisz odtworzyć format i jest to ruchomy cel (format zmienił się z biegiem lat). Prawdopodobnie nie warto się tym przejmować, ale widziałem (własne) aplikacje, które to robią. –

7
+0

Tak, właśnie miałem to opublikować. Mimo że OP mógł po prostu użyć "google python rar" ... – Kiv

+3

Niestety, wciąż potrzebujesz unrar, aby to działało - to po prostu fajne API na uruchamianie zewnętrznego narzędzia. –

+0

@kiv W mojej obronie zrobiłem w rzeczywistości google podobne, ale znalazłem głównie informacje na temat biblioteki Chilkat. Wygląda też na to, że rarfile wciąż polega na unrar. –

0

Spójrz na Pythonie "struct" modułu. Następnie można zinterpretować format pliku RAR bezpośrednio w programie Python, umożliwiając pobranie zawartości wewnątrz RAR bez konieczności korzystania z oprogramowania zewnętrznego, aby zrobić to za Ciebie.

EDYCJA: Jest to oczywiście Python vanilla - istnieją alternatywy, które korzystają z modułów stron trzecich (jak już zostały opublikowane).

EDYCJA 2: Zgodnie z Wikipedia's article moja odpowiedź wymagałaby zgody autora.

+0

Myślę, że to prawdopodobnie stawia cię w mrocznym legalnym terytorium. (Podejrzewam, że to co robi rarfile to granica tego, co wolno ci robić bez licencjonowania RAR). –

+0

Czy mówisz, że istnieje patent na format pliku? –

+0

Ważny punkt. Nie myślałem o konsekwencjach prawnych :) –

0

Urządzenie obsługuje także pliki RAR.

+0

Czy jest on w stanie załadować je do pamięci za pomocą Pythona? 7zip jest dobry, ale nie jestem pewien, czy odpowiada na to pytanie. – Kiv

+2

@Kiv: Jest tak sprawny jak Rarfile, naprawdę, ponieważ możesz po prostu użyć subprocess.popen do zarządzania plikiem. –

+0

@Nick: Dobrze. – Kiv

1

RAR jest prawnie zastrzeżonym formatem; Nie sądzę, by istniały jakiekolwiek publiczne specyfikacje, więc wsparcie narzędzi i bibliotek stron trzecich jest słabe, by nie istniało.

Lepiej korzystaj z ZIP; jest całkowicie darmowy, ma dokładną specyfikację publiczną, biblioteka kompresji jest dostępna wszędzie (zlib jest jedną z najszerzej rozpowszechnianych bibliotek na świecie) i jest bardzo łatwa do kodowania.

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

+0

Chociaż zgadzam się, że zip jest fajnym formatem do tego, to niestety jest to tylko jeden z dwóch popularnych formatów używanych do dystrybucji komiksów, a drugi to drugi. Muszę wspierać oba. –

1

Biblioteka pyUnRAR2 można wyodrębnić pliki z archiwum RAR do pamięci i dysku (jeśli chcesz). Jest dostępny pod licencją MIT i po prostu opakowuje UnRAR.dll w Windows i unrar na Uniksie. Kliknij "QuickTutorial", aby zobaczyć przykłady użycia.

W systemie Windows jest w stanie wyodrębnić do pamięci (a nie dysku) za pomocą (w zestawie) UnRAR.dll, ustawiając wywołanie zwrotne za pomocą RARSetCallback(), a następnie wywołując RARProcessFile() z opcją RAR_TEST zamiast opcji RAR_EXTRACT aby uniknąć wyodrębniania plików na dysk. Callback następnie sprawdza zdarzenia UCM_PROCESSDATA, aby odczytać dane.Z dokumentacji zdarzeń UCM_PROCESSDATA: "Przetwarzaj niepakowane dane. Może być używany do odczytu pliku podczas jego ekstrakcji lub testowania bez faktycznego rozpakowywania pliku na dysk."

W systemie Unix, unrar może po prostu wydrukować plik na standardowe wyjście, więc biblioteka czyta tylko z potoku podłączonego do standardowego wyjścia Unrara. Niezbędny plik binarny, którego potrzebujesz, to ten, który ma polecenie "p" dla polecenia "Drukuj plik na stdout". Użyj "apt-get install unrar", aby zainstalować go w systemie Ubuntu.

2

Wydaje się, że ograniczeniem, które rarsoft nakłada na utwory zależne, jest to, że nie można użyć kodu źródłowego unrar do utworzenia wariantu algorytmu RAR COMPRESSION. Z kontekstu wydaje się, że pozwala on użytkownikom na użycie swojego kodu (zmodyfikowanego lub nie) do dekompresji plików, ale nie można ich użyć, jeśli zamierzasz napisać własny kod kompresji. Oto cytat z pliku license.txt Właśnie ściągnąłem:

  1. źródeł UnRAR mogą być wykorzystane w dowolnym oprogramowaniem do obsługi archiwów RAR bez ograniczeń bezpłatnie, ale nie może być stosowany aby odtworzyć algorytm kompresji RAR, który jest zastrzeżony. Dystrybucja zmodyfikowanych źródeł UnRAR w oddzielnej formie lub jako część innego oprogramowania jest dozwolona pod warunkiem, że jest wyraźnie podana w dokumentacji i komentarzach źródłowych, że kod może nie może być wykorzystany do opracowania archiwizatora zgodnego z RAR (WinRAR) .

Widząc jak każdy wydawał się po prostu coś, co pozwoliłoby im napisać komiks widza zdolną obsłużyć czytania obrazów z CBR (RAR) plików, ja nie rozumiem, dlaczego ludzie myślą, że coś utrzymując je z pomocą dostarczony kod źródłowy.

+0

Podążając za sobą, zauważyłem, że archiwum kodu źródłowego unrar może się skompilować zarówno do libunrar.dll, jak i libunrar.so. Można użyć polecenia: make -f makefile.unix lib – btx

+0

Aby zobaczyć, co się stanie, zmieniłem kod http: //.google.com/p/py-unrar2/ lib wymienione poniżej, aby użyć libunrar.so, który zbudowałem na moim systemie OSX. Po prostu musiałem zmienić 3 lub 4 rzeczy w windows.py, np. Zastąpić bity, które odnoszą się do typów danych Windows, standardowymi ctypami, i zmienić, aby wyszukać mój .so zamiast .dll. Jeden z testów wydaje się również powodować błędy (wydaje się, że jest to oddzwanianie hasłem). Zobaczę, czy uda mi się coś takiego wymyślić. – btx