2009-07-27 44 views
6

Tôi đang tìm cách đọc các tệp cụ thể từ kho lưu trữ rar vào bộ nhớ. Cụ thể, chúng là tập hợp các tệp hình ảnh được đánh số (tôi đang viết một trình đọc truyện tranh). Trong khi tôi chỉ đơn giản là có thể unrar các tập tin này và tải chúng khi cần thiết (xóa chúng khi thực hiện), tôi muốn tránh điều đó nếu có thể.Đọc nội dung của tệp RAR vào bộ nhớ trong Python

Đó là tất cả đã nói, tôi muốn một giải pháp đó là nền tảng chéo (Windows/Linux) nếu có thể, nhưng Linux là phải. Cũng quan trọng, nếu bạn định chỉ ra một thư viện để xử lý điều này cho tôi, hãy hiểu rằng nó phải miễn phí (như trong bia) hoặc PMNM.

Trả lời

4

Câu trả lời thực sự là không có thư viện và bạn không thể tạo một thư viện. Bạn có thể sử dụng rarfile, hoặc bạn có thể sử dụng unzip 7zip (ít miễn phí hơn 7zip, nhưng vẫn miễn phí như trong bia), nhưng cả hai phương pháp đều yêu cầu một tệp thực thi bên ngoài. Giấy phép cho RAR về cơ bản đòi hỏi điều này, vì trong khi bạn có thể lấy mã nguồn cho unRAR, bạn không thể sửa đổi nó theo bất kỳ cách nào và biến nó thành một thư viện sẽ cấu thành sự sửa đổi bất hợp pháp.

Ngoài ra, lưu trữ RAR rắn (nén tốt nhất) không thể truy cập ngẫu nhiên, vì vậy bạn phải hủy lưu trữ toàn bộ mọi thứ. WinRAR trình bày một giao diện người dùng dường như để tránh điều này, nhưng thực sự nó chỉ giải nén và đóng gói lại kho lưu trữ trong nền.

+0

Có vẻ như tôi sẽ chỉ phải gọi unrar và giải nén vào một thư mục tạm thời để sử dụng và dọn dẹp nó khi hoàn thành. Cảm ơn! –

+0

Tất nhiên bạn có thể làm một cái, nhưng bạn phải đảo ngược kỹ sư định dạng, và nó là một mục tiêu di động (định dạng đã thay đổi qua nhiều năm). Nó có lẽ không đáng làm phiền, nhưng tôi đã thấy (độc quyền) ứng dụng mà làm điều đó. –

7
+0

Có, tôi sắp đăng bài này. Mặc dù OP có thể chỉ googled "python rar" ... – Kiv

+3

Bạn không may vẫn cần unrar để làm việc này - nó chỉ là một API tốt đẹp khi chạy một tiện ích bên ngoài. –

+0

@kiv Trong phòng thủ của tôi, tôi đã làm trong thực tế google tương tự nhưng tìm thấy chủ yếu là thông tin về thư viện Chilkat. Nó cũng giống như rarfile vẫn dựa vào unrar. –

0

Nhìn vào Python "struct" mô-đun. Sau đó bạn có thể giải thích định dạng tệp RAR trực tiếp trong chương trình Python của bạn, cho phép bạn truy xuất nội dung bên trong RAR mà không phụ thuộc vào phần mềm bên ngoài để làm điều đó cho bạn.

EDIT: Đây là khóa học vani Python - có các lựa chọn thay thế sử dụng các mô-đun của bên thứ ba (như đã được đăng).

CHỈNH SỬA 2: Theo số Wikipedia's article câu trả lời của tôi sẽ yêu cầu bạn phải có sự cho phép của tác giả.

+0

Tôi nghĩ rằng điều này có thể đặt bạn vào lãnh thổ pháp lý tối tăm. (Tôi nghi ngờ rằng những gì rarfile làm là giới hạn của những gì bạn được phép làm mà không có giấy phép RAR). –

+0

Bạn có nói rằng có bằng sáng chế về định dạng tệp không? –

+0

Điểm hợp lệ. Tôi đã không nghĩ đến các chi nhánh hợp pháp :) –

0

free 7zip library cũng có thể xử lý các tệp RAR.

+0

Có thể tải chúng vào bộ nhớ bằng Python không? 7zip là tốt, nhưng tôi không chắc nó trả lời câu hỏi. – Kiv

+2

@Kiv: Nó có khả năng là rarfile, thực sự, vì bạn chỉ có thể sử dụng subprocess.popen để quản lý tệp. –

+0

@Nick: Tốt. – Kiv

1

RAR là định dạng độc quyền; Tôi không nghĩ rằng có bất kỳ thông số kỹ thuật nào, do đó, công cụ hỗ trợ thư viện của bên thứ ba là kém để không tồn tại.

Bạn nên sử dụng ZIP nhiều hơn; nó hoàn toàn miễn phí, có thông số công khai chính xác, thư viện nén có sẵn ở khắp mọi nơi (zlib là một trong những thư viện được triển khai rộng rãi nhất trên thế giới) và rất dễ dàng để mã hóa.

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

+0

Trong khi tôi đồng ý rằng zip là một định dạng tốt đẹp cho điều này, nó không may là chỉ là một trong hai định dạng phổ biến được sử dụng để phân phối truyện tranh, rar là khác. Tôi cần hỗ trợ cả hai. –

1

Thư viện pyUnRAR2 có thể trích xuất tập tin từ tài liệu lưu trữ RAR vào bộ nhớ (và đĩa nếu bạn muốn). Nó có sẵn theo giấy phép MIT và chỉ đơn giản là kết thúc tốt đẹp UnRAR.dll trên Windows và unrar trên Unix. Nhấp vào "QuickTutorial" để biết các ví dụ sử dụng.

Trên Windows, nó có thể giải nén vào bộ nhớ (và không phải đĩa) với (bao gồm) UnRAR.dll bằng cách thiết lập gọi lại bằng RARSetCallback() và sau đó gọi RARProcessFile() với tùy chọn RAR_TEST thay vì tùy chọn RAR_EXTRACT để tránh trích xuất bất kỳ tệp nào vào đĩa. Gọi lại sau đó xem các sự kiện UCM_PROCESSDATA để đọc dữ liệu.Từ tài liệu cho các sự kiện UCM_PROCESSDATA: "Xử lý dữ liệu đã giải nén. Nó có thể được sử dụng để đọc một tệp trong khi nó đang được trích xuất hoặc thử nghiệm mà không thực sự giải nén tệp vào đĩa."

Trên Unix, unrar có thể chỉ cần in tệp để xuất bản, do đó thư viện chỉ đọc từ một đường ống được kết nối với stdout của unrar. Các nhị phân unrar bạn cần là một trong đó có "p" cho "In tập tin để stdout" lệnh. Sử dụng "apt-get install unrar" để cài đặt nó trên Ubuntu.

2

Dường như giới hạn mà rarsoft áp dụng cho các tác phẩm phái sinh là bạn không được sử dụng mã nguồn unrar để tạo biến thể của thuật toán RAR COMPRESSION. Từ ngữ cảnh, có vẻ như nó cho phép mọi người sử dụng mã của mình (đã sửa đổi hay không) để giải nén các tệp, nhưng bạn không thể sử dụng chúng nếu bạn có ý định viết mã nén của riêng bạn. Dưới đây là một trích dẫn trực tiếp từ file license.txt Tôi chỉ cần tải:

  1. Nguồn Unrar có thể được sử dụng trong bất kỳ phần mềm để xử lý RAR tài liệu lưu trữ mà không giới hạn miễn phí, nhưng không thể được sử dụng để tái tạo thuật toán nén RAR, vốn là độc quyền. Phân phối các nguồn UnRAR đã sửa đổi dưới dạng riêng biệt hoặc được cho phép một phần của phần mềm khác, với điều kiện rõ ràng là được nêu trong tài liệu và ý kiến ​​nguồn rằng mã số không được sử dụng để phát triển trình lưu trữ tương thích RAR (WinRAR) .

Thấy mọi người dường như chỉ muốn thứ gì đó cho phép họ viết một người xem truyện tranh có khả năng xử lý hình ảnh đọc từ tệp CBR (rar), tôi không hiểu tại sao mọi người nghĩ rằng có bất cứ điều gì ngăn họ sử dụng mã nguồn được cung cấp.

+0

Để theo dõi tôi, tôi nhận thấy kho lưu trữ mã nguồn unrar thực sự có thể biên dịch thành cả libunrar.dll lẫn libunrar.so. Bạn sẽ sử dụng dòng lệnh: make -f makefile.unix lib – btx

+0

Chỉ để xem điều gì sẽ xảy ra, tôi đã thay đổi mã http: //.google.com/p/py-unrar2/ lib được liệt kê bên dưới để sử dụng libunrar.so mà tôi đã tạo trên hộp OSX của mình. Tôi chỉ phải thay đổi 3 hoặc 4 thứ trong windows.py, như thay thế các bit liên quan đến các kiểu dữ liệu windows với các ctypes chuẩn, và thay đổi để tìm kiếm .so thay vì .dll. Một trong các bài kiểm tra dường như cũng bị phân đoạn (có vẻ là gọi lại mật khẩu). Tôi sẽ xem liệu tôi có thể hình dung ra điều đó không. – btx

Các vấn đề liên quan