【问题标题】:Extract single file from RAR archive with rarfile in Python在 Python 中使用 rarfile 从 RAR 存档中提取单个文件
【发布时间】:2017-09-17 13:36:17
【问题描述】:

我有一个包含 2 个文件的 RAR 存档,我只想提取一个。我在另一个答案中发现我可以使用rarfile 包,根据documentation 包含extract 函数。但是,当我尝试运行脚本时,我会得到一个 FileNotFoundError: [WinError 2] 和以下信息:During handling of the above exception, another exception occurred: ... rarfile.RarCannotExec: Unrar not installed? (rarfile.UNRAR_TOOL='unrar')

根据我能找到的信息,我发现这可能与 PATH 中缺少 Unrar.exe 可执行文件有关,我尝试添加它,但没有任何改变。另一个建议是将rarfile.UNRAR_TOOL='unrar' 添加到脚本中,作为配置包行为的一种方式,同样的错误。

这是我的 MWE,用 Python 3.5.3 编写和测试:

from rarfile import RarFile

with RarFile('Test.rar') as file:
    file.extract(file.namelist()[0])

文件正在正确打开,因为file.namelist() 返回存档的内容。

提前致谢!

【问题讨论】:

  • 哪个版本的python?
  • Python 3.5.3。我会更新 OP。

标签: python extract rar


【解决方案1】:

基于 OP cmets 的更新

我设法使用以下代码仅解压了一个文件

from rarfile import RarFile
RarFile.UNRAR_TOOL='C:\\full\\path\\to\\UnRARDLL.exe'

with RarFile('test.rar') as file:
    file.extract(file.namelist()[0])

下载UnRARDLL.exe 并提供RarFile.UNRAR_TOOL 的正确完整路径。


您可能想使用patool

import patoolib
patoolib.extract_archive("Test.rar", outdir="/some/dir")

适用于 windowslinux,无需额外的软件。
安装使用:pip install patool

【讨论】:

  • 我的目标是提取特定文件,看起来该命令提取了整个存档。我找不到关于那个包的任何文档,所以我不知道它中的其他可用功能。最初我使用pyunpack,但只需要一个文件导致我使用rarfile
  • 我的食物到了,我得尽快回复你。
  • 我做到了,谢谢!我已根据您的评论更新了我的答案。
  • 我遵循了你的建议,但我得到了完全相同的错误。你确定你没有做其他事情吗?无论如何,即使它有效,它也不是一个很好的解决方案,因为它意味着至少必须携带该可执行文件。不过,感谢您的贡献。
  • 据我所知,没有安装额外文件的开箱即用解决方案
【解决方案2】:

如果 RAR 文件使用压缩,您必须以某种方式使用 unrar(或基于 unrar 源代码的东西)。如果不使用压缩,rarfile 可以为您完成所有工作。

Pedro Lobito 的解决方案必须有效。如果你得到FileNotFoundError,我建议你再次检查你的文件名和路径。在你的问题中,你说:rarfile.UNRAR_TOOL='unrar',但rarfile 的大写必须是RarFile,如上图 Pedro 所示。两者都是正确的代码,但它们具有不同的含义。也可以尝试使用完整路径,不要忘记 .exe。

【讨论】:

  • 我确实重新检查了名称和路径。我注意到我提到了命令的“模板版本”,但实际上我使用了正确的大小写和路径,包括 .exe。我真的不知道为什么它不起作用,但我真的想避免依赖外部可执行文件。在佩德罗回答的第四条评论中,我提到我能够使用patool 提取整个档案,而无需携带unrar.exe。如果有一种方法可以对整个档案进行处理,那么将它用于单个文件应该不难。我只是不想为 1 Mb 提取 1 Gb 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2020-05-15
相关资源
最近更新 更多