在Python中将RAR文件的内容读入内存

在Python中将RAR文件的内容读入内存,python,linux,stream,rar,Python,Linux,Stream,Rar,我正在寻找一种将特定文件从rar归档文件读入内存的方法。具体来说,它们是一个编号图像文件的集合(我正在写一个漫画阅读器)。虽然我可以简单地取消这些文件的归档并根据需要加载它们(完成后删除它们),但如果可能的话,我宁愿避免这样做 总而言之,如果可能的话,我更喜欢跨平台(Windows/Linux)的解决方案,但Linux是必须的。同样重要的是,如果您要为我指出一个库来处理此问题,请理解它必须是免费的(如啤酒)或OSS。请参阅rarfile模块: 看看Python的“struct”模块。然后

我正在寻找一种将特定文件从rar归档文件读入内存的方法。具体来说,它们是一个编号图像文件的集合(我正在写一个漫画阅读器)。虽然我可以简单地取消这些文件的归档并根据需要加载它们(完成后删除它们),但如果可能的话,我宁愿避免这样做


总而言之,如果可能的话,我更喜欢跨平台(Windows/Linux)的解决方案,但Linux是必须的。同样重要的是,如果您要为我指出一个库来处理此问题,请理解它必须是免费的(如啤酒)或OSS。

请参阅rarfile模块:

看看Python的“struct”模块。然后,您可以直接在Python程序中解释RAR文件格式,这样您就可以检索RAR中的内容,而无需依赖外部软件

编辑:这当然是普通的Python——也有使用第三方模块的替代方案(如前所述)


编辑2:根据我的回答,您需要获得作者的许可。

也可以处理RAR文件。

真正的答案是没有库,您无法创建库。您可以使用rarfile,也可以使用7zip unrr(它比7zip免费,但仍然像beer一样免费),但这两种方法都需要外部可执行文件。RAR的许可证基本上要求这一点,因为虽然您可以获得UNRR的源代码,但您不能以任何方式对其进行修改,并且将其转换为库将构成非法修改


此外,固体RAR档案(最好的压缩)不能随机访问,所以你必须取消整个东西的档案。WinRAR提供的UI似乎避免了这种情况,但实际上它只是在后台解包和重新打包归档文件。

RAR是一种专有格式;我认为没有任何公共规范,所以第三方工具和库支持很差,甚至不存在

你最好使用拉链;它是完全免费的,有一个精确的公共规范,压缩库随处可见(zlib是世界上部署最广泛的库之一),而且很容易编写代码

该库可以将文件从RAR归档文件提取到内存(如果需要,还可以提取到磁盘)。它在MIT许可下可用,只需在Windows上包装unrr.dll,在Unix上包装unrr。单击“快速教程”查看使用示例

在Windows上,它可以使用(包括)unrr.dll提取到内存(而不是磁盘),方法是使用RARSetCallback()设置回调,然后使用RAR_测试选项而不是RAR_提取选项调用RARProcessFile(),以避免将任何文件提取到磁盘。然后回调函数监视UCM_PROCESSDATA事件以读取数据。来自UCM_PROCESSDATA事件文档:“处理未打包的数据。它可用于在提取或测试文件时读取文件,而无需实际将文件提取到磁盘。”


在Unix上,UNRR可以简单地将文件打印到标准输出,因此库只需从连接到UNRR标准输出的管道中读取。您需要的unrr二进制文件是具有“p”表示“Print file to stdout”命令的二进制文件。使用“apt get install unrr”将其安装到Ubuntu上。

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

  • UNRR源可用于任何处理RAR的软件 无限制的档案免费,但不能使用 重新创建专有的RAR压缩算法。 修改后的UNAR来源以单独形式或作为 允许使用其他软件的一部分,前提是 在文档和源代码注释中声明代码可能 不用于开发与RAR(WinRAR)兼容的archiver

  • 鉴于每个人似乎都希望能够编写一个能够处理从CBR(rar)文件读取图像的漫画查看器,我不明白为什么人们会认为有什么东西阻止他们使用提供的源代码。

    是的,我正要发布这篇文章。虽然OP可以在谷歌上搜索“python rar”…但不幸的是,你仍然需要unrar才能工作-这只是一个运行外部实用程序的很好的API。@kiv在我的辩护中,我实际上也在谷歌上搜索了类似的内容,但在Chilkat库中找到了大部分信息。看起来rarfile仍然依赖unrr。它能用Python将它们加载到内存中吗?7zip很好,但我不确定它是否回答了这个问题。@Kiv:它和rarfile一样,真的,因为你可以使用subprocess.popen来管理文件。我想这可能会让你处于一个模糊的法律领域。(我怀疑RAR文件所做的是你在没有授权RAR的情况下可以做的事情的限制)。@Glenn恐怕是这样,或者至少这是谷歌告诉我的。谷歌没有告诉我任何事情,我的Linux版本RAR中的法律声明只有版权声明。我编辑了我的回答,添加了一个指向维基百科RAR条目的链接。看起来你必须得到作者的许可,但要求开发者得到一个结论性的答案(销售部分)并没有什么坏处。虽然我同意zip是一种很好的格式,但不幸的是,它只是用于分发漫画的两种常见格式之一,rar是另一种。我需要两者都支持。看起来我只需要调用unrr并提取到一个临时目录以供使用,完成后将其清理。谢谢当然你可以做一个,但是你必须对格式进行反向工程,这是一个移动的目标(格式多年来一直在变化)。这可能不值得费心,但我