在Python中将RAR文件内容读入内存
我想找一种方法,可以直接从rar压缩包中读取特定的文件到内存里。具体来说,这些文件是一些编号的图片(因为我在写一个漫画阅读器)。虽然我可以简单地解压这些文件,然后根据需要加载它们(用完后再删除),但如果能避免这样做,我会更喜欢。
另外,我希望这个解决方案能够在不同的操作系统上都能用(比如Windows和Linux),但Linux是必须支持的。更重要的是,如果你推荐一个库来帮我处理这些文件,请确保这个库是免费的(就像喝啤酒一样)或者是开源的。
7 个回答
pyUnRAR2这个库可以从RAR压缩文件中提取文件,提取的内容可以放在内存里(也可以放到硬盘上,如果你需要的话)。这个库是根据MIT许可证发布的,简单来说,它在Windows上使用UnRAR.dll,而在Unix系统上使用unrar。你可以点击“QuickTutorial”查看使用示例。
在Windows上,它可以通过包含的UnRAR.dll将文件提取到内存中,而不是硬盘。你需要设置一个回调函数,使用RARSetCallback(),然后调用RARProcessFile()时选择RAR_TEST选项,这样就不会把文件提取到硬盘上。这个回调函数会监听UCM_PROCESSDATA事件,以读取数据。关于UCM_PROCESSDATA事件的说明是:“处理解压后的数据。可以在文件被提取或测试时读取,而不需要实际将文件提取到硬盘上。”
在Unix系统上,unrar可以直接将文件打印到标准输出,所以这个库只是从连接到unrar标准输出的管道中读取数据。你需要的unrar二进制文件是带有“p”命令的,也就是“打印文件到标准输出”。在Ubuntu上,你可以使用“apt-get install unrar”来安装它。
其实,真正的情况是没有现成的库可以用,也不能自己做一个。你可以用rarfile,或者用7zip的unRAR(这个比7zip的自由度低一点,但还是可以免费用),不过这两种方法都需要你安装一个外部程序。RAR的许可证基本上就是要求这样,虽然你可以拿到unRAR的源代码,但你不能对它进行任何修改,把它变成一个库就是非法修改了。
另外,固态RAR压缩包(压缩效果最好的那种)不能随机访问,所以你无论如何都得把整个压缩包解压出来。WinRAR提供的界面看起来好像可以避免这个问题,但实际上它在后台只是把压缩包解压再重新打包而已。