【问题标题】:Read content of RAR file into memory in Python在 Python 中将 RAR 文件的内容读入内存
【发布时间】:2010-11-14 05:33:19
【问题描述】:

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

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

【问题讨论】:

    标签: python linux stream rar


    【解决方案1】:

    【讨论】:

    • 是的,我正要发布这个。虽然 OP 可能只是用谷歌搜索了“python rar”...
    • 不幸的是,您仍然需要 unrar 才能使其工作 - 它只是运行外部实用程序的一个不错的 API。
    • @kiv 在我的辩护中,我确实在谷歌上做过类似的事情,但主要是在 Chilkat 图书馆上找到的信息。看起来 rarfile 仍然依赖于 unrar。
    【解决方案2】:

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

    1. UnRAR 源可用于任何软件来处理 RAR 档案无限制免费,但不能使用 重新创建专有的 RAR 压缩算法。 以单独的形式或作为一个已修改的 UnRAR 源分发 允许使用其他软件的一部分,前提是明确 在文档和源 cmets 中说明代码可能 不能用于开发兼容 RAR (WinRAR) 的存档器。

    看到每个人似乎都想要一些东西,让他们能够编写一个能够处理从 CBR (rar) 文件读取图像的漫画查看器,我不明白为什么人们认为有任何东西阻止他们使用提供的源代码.

    【讨论】:

    • 跟进自己,我注意到 unrar 源代码存档实际上可以编译成 libunrar.dll 和 libunrar.so。您将使用命令行:make -f makefile.unix lib
    • 只是想看看会发生什么,我将下面列出的code.google.com/p/py-unrar2 lib 更改为使用 libunrar.so,以便在我的 OSX 机器上构建。我只需要在 windows.py 中更改 3 或 4 件事,例如用标准 ctypes 替换引用 windows 数据类型的位,并更改为查找我的 .so 而不是 .dll。其中一项测试似乎也出现了段错误(似乎是密码回调)。我会看看我能不能解决这个问题。
    【解决方案3】:

    pyUnRAR2 库可以将文件从 RAR 压缩包中提取到内存(如果需要,还可以提取到磁盘)。它在 MIT 许可下可用,并且在 Windows 上简单地包装了 UnRAR.dll,在 Unix 上简单地包装了 unrar。点击“快速教程”查看使用示例。

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

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

    【讨论】:

      【解决方案4】:

      查看 Python“结构”模块。然后,您可以直接在 Python 程序中解释 RAR 文件格式,允许您检索 RAR 中的内容,而无需依赖外部软件为您完成。

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

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

      【讨论】:

      • 我认为这可能会使您陷入模糊的法律领域。 (我怀疑 rarfile 所做的是在没有 RAR 许可的情况下允许您做的事情的限制)。
      • @Glenn 恐怕是这样,或者至少谷歌是这么告诉我的。
      • Google 没有告诉我任何事情,而且我的 RAR Linux 副本中的法律声明只有版权声明。
      • 我编辑了我的答案,添加了一个指向 Wikipedia 在 RAR 上的条目的链接。看来您必须获得作者的许可,但要求开发人员获得结论性答案也无妨(rarlab.com/feedback.htm,销售部分)。
      【解决方案5】:

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

      使用 ZIP 会更好;它完全免费,具有准确的公共规范,压缩库随处可用(zlib 是世界上部署最广泛的库之一),并且非常容易编写代码。

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

      【讨论】:

      • 虽然我同意 zip 是一种很好的格式,但不幸的是它只是用于分发漫画的两种常见格式之一,rar 是另一种。我需要两者都支持。
      【解决方案6】:

      真正的答案是没有图书馆,而且你也做不出。您可以使用 rarfile,也可以使用 7zip unRAR(它比 7zip 免费,但仍然像啤酒一样免费),但这两种方法都需要外部可执行文件。 RAR的license基本上是这样要求的,unRAR的源码虽然可以拿到,但不能以任何方式修改,转为库属于非法修改。

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

      【讨论】:

      • 看起来我只需要调用 unrar 并提取到临时目录以供使用并在完成后清理它。谢谢!
      • 当然你可以制作一个,但是你必须对格式进行逆向工程,而且它是一个移动的目标(格式多年来一直在变化)。这可能不值得费心,但我见过(专有)应用程序可以做到这一点。
      【解决方案7】:

      free 7zip library 也可以处理 RAR 文件。

      【讨论】:

      • 是否能够使用 Python 将它们加载到内存中? 7zip 很好,但我不确定它是否能回答问题。
      • @Kiv:它和 r​​arfile 一样强大,真的,因为你可以使用 subprocess.popen 来管理文件。
      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      相关资源
      最近更新 更多