2009-07-27 123 views
6

我正在寻找一种方法将rar档案中的特定文件读入内存。具体来说,他们是编号图像文件的集合(我在写漫画阅读器)。虽然我可以简单地解压缩这些文件并根据需要加载它们(在完成时删除它们),但如果可能,我宁愿避免这种情况。如果可能的话,我更喜欢跨平台(Windows/Linux)的解决方案,但Linux是必须的。同样重要的是,如果你要指出一个图书馆来处理这个问题,请理解它必须是免费的(如啤酒)或OSS。在Python中将RAR文件的内容读入内存中

回答

4

真正的答案是没有图书馆,你不能做一个。你可以使用rarfile,或者你可以使用7zip unRAR(它比7zip更自由,但仍然像啤酒一样自由),但是这两种方法都需要外部可执行文件。 RAR许可证基本上要求这样做,因为虽然可以获得unRAR的源代码,但不能以任何方式对其进行修改,并将其转换为库将构成非法修改。

此外,固态RAR压缩文件(压缩最好)不能随机访问,因此无论如何您必须解压整个文件。 WinRAR提供了一个似乎可以避免这种情况的UI,但实际上它只是在后台解压缩和重新打包存档。

7
+0

是的,我正要发布这个。尽管OP可能只是搜索“python rar”... ... – Kiv 2009-07-27 00:56:36

+3

您不幸的是仍然需要unrar才能正常工作 - 这只是运行外部实用程序的一个不错的API。 – 2009-07-27 01:05:50

+0

@kiv在我的防守中,我确实在谷歌上做过类似的事情,但主要发现了奇尔卡特图书馆的信息。它看起来像rarfile仍然依赖unrar。 – 2009-07-27 01:17:37

0

看Python的 “结构” 模块。然后,您可以直接在您的Python程序中解释RAR文件格式,从而可以在不依赖外部软件的情况下检索RAR中的内容。

编辑:这当然是香草Python - 有使用第三方模块(如已发布)的替代品。

编辑2:根据Wikipedia's article我的回答将要求您从作者的许可。

+0

我认为这可能会让你陷入一片黑暗的法律领域。 (我怀疑rarfile做的是没有授权RAR允许你做什么的限制)。 – 2009-07-27 01:12:52

+0

你是说文件格式有专利吗? – 2009-07-27 02:11:36

+0

有效的一点。我没有想到法律后果:) – 2009-07-27 02:11:54

1

RAR是专有格式;我不认为有任何公开说明,所以第三方工具和库支持很差,不存在。

你用ZIP更好;它是完全免费的,具有准确的公开规范,压缩库在任何地方都可用(zlib是世界上部署最广泛的库之一),并且编码起来非常简单。 (如果你想和磁盘)

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

1

pyUnRAR2库可以提取RAR压缩文件到内存中的文件。它可以在MIT许可下获得,只需在Windows上打开UnRAR.dll,在Unix上打开unrar。点击“QuickTutorial”查看使用示例。

在Windows上,通过使用RARSetCallback()设置回调,然后使用RAR_TEST选项而不是RAR_EXTRACT选项调用RARProcessFile(),它能够通过(包含)UnRAR.dll提取到内存(而不是磁盘)避免将任何文件提取到磁盘。回调函数然后监视UCM_PROCESSDATA事件以读取数据。从UCM_PROCESSDATA事件的文档:“处理解压后的数据。它可能用于在文件被提取或测试时读取文件,而不实际提取文件到磁盘。”

在Unix上,unrar可以简单地将文件打印到标准输出,因此库只是从连接到unrar的标准输出的管道读取数据。您需要的unrar二进制文件是“打印文件到标准输出”命令的“p”。使用“apt-get install unrar”在Ubuntu上安装它。

2

似乎rarsoft对衍生作品施加的限制是,您可能不会使用unrar源代码来创建压缩算法的变体RAR COMPARESSION算法。从上下文来看,它似乎是特别允许人们使用他的代码(修改或不是)来解压缩文件,但如果您打算编写自己的压缩代码,则不能使用它们。下面是我刚刚下载的license.txt文件直接引:

  1. 的的UnRAR源可以在任何软件可以用来处理RAR 档案没有免费的局限性,但不能用于 重新创建RAR压缩算法,这是专有的。 允许以单独形式或作为其他软件的一部分分发修改的UnRAR源文件,只要它明确指出 在文档和源注释中说明代码可能不会用于开发兼容RAR(WinRAR)的归档程序的 。

看到大家似乎只是想让他们写一个漫画阅读器能够处理来自CBR(rar)文件的阅读图像,我不明白为什么人们认为有什么阻止他们使用提供了源代码。