【问题标题】:Not managing to extract RAR archive using rarfile module无法使用 rarfile 模块提取 RAR 存档
【发布时间】:2016-10-25 22:53:06
【问题描述】:

我一直在尝试制作一个脚本来提取 *.rar 文件,但收到错误消息。我一直在努力理解模块的文档,但无济于事(我是编程新手,所以有时会在所有文档中迷失方向)。

这是我的代码的相关部分,以及收到的错误。

我的代码片段:

import rarfile
rarpath='/home/maze/Desktop/test.rar'

def unrar(file):
    rf=rarfile.RarFile(file)
    rf.rarfile.extract_all()

unrar(rarpath)

收到错误:

  File "unrarer.py", line 26, in unrar
    rf.rarfile.extract_all()
AttributeError: 'str' object has no attribute 'extract_all'

我使用pip 安装了rarfile2.8 和unrar0.3(请注意是否需要后者)。

在此先感谢您在纠正我的功能或帮助理解包的文档时提供任何帮助。

【问题讨论】:

    标签: python rar


    【解决方案1】:

    一般来说对 RAR 文件的支持很差,这种体验是正常的。

    为了让rarfile Python 模块工作,您还必须安装一个支持的工具来提取 RAR 文件。您仅有的两个选择是bsdtarunrar。不要用 Pip 安装这些,你必须用你的 Linux 包管理器安装它们(或者你自己安装它们,如果你认为计算机的时间比你的时间更有价值)。例如在基于 Debian 的系统(包括 Ubuntu)上运行,

    sudo apt install bsdtar
    

    或者,

    sudo apt install unrar
    

    请注意,bsdtar 对 RAR 文件的支持与 Unrar 不同。一些较新的 RAR 文件无法使用 bsdtar 解压缩。

    那么你的代码应该是这样的:

    import rarfile
    
    def unrar(file):
        rf = rarfile.RarFile(file)
        rf.extract_all()
    
    unrar('/home/maze/Desktop/test.rar')
    

    注意使用rf.extract_all(),而不是rf.rarfile.extract_all()

    如果你只是在做extract_all,那么就没有必要使用rarfile 模块。您可以只使用subprocess 模块:

    import subprocess
    path = '/path/to/archive.rar'
    subprocess.check_call(['unrar', 'x', path])
    

    rarfile 模块基本上只不过是subprocess 的包装。

    当然,如果您对此有选择权,我建议您将存档迁移到更便携且受更好支持的存档格式。

    【讨论】:

      【解决方案2】:

      rf.rarfile 是文件的名称,您可以通过打印其值来查看。删除它并查看help(rarfile.RarFile) 以获取您想要的方法。

      import rarfile
      rarpath='/home/maze/Desktop/test.rar'
      
      def unrar(file):
          rf=rarfile.RarFile(file)
          rf.extractall()
      
      unrar(rarpath)
      

      【讨论】:

        【解决方案3】:

        尝试使用rf.extractall() 而不是rf.rarfile.extract_all(),因为@tdelaney 指出rf.rarfile 是文件的名称。

        并将import unrar 更改为from unrar import rarfile,因为您需要unrarrarfile 之上打开/读取rar 文件并将它们提取到内存中

        from unrar import rarfile
        rarpath='/home/maze/Desktop/test.rar'
        
        def unrar(file):
            rf=rarfile.RarFile(file)
            rf.extractall()
        
        unrar(rarpath)
        

        【讨论】:

        • 仍然收到同样的错误:AttributeError: 'str' object has no attribute 'extractall'
        • @maze88 我的错应该是 rf.extractall() 而不是 rf.rarfile.extractall()
        • 收到另一个错误,我之前尝试自己解决时遇到了这个错误:raise RarCannotExec("Unrar not installed? (rarfile.UNRAR_TOOL=%r)" % UNRAR_TOOL) rarfile.RarCannotExec: Unrar not安装? (rarfile.UNRAR_TOOL='unrar')
        • 你导入 unrar 了吗?假设你已经安装了它。 @迷宫88
        • 尝试从 unrar 导入 rarfile
        【解决方案4】:

        试试这个

        import fnmatch
        from rarfile import RarFile
        
        path = r'C:\Users\byqpz\Desktop\movies\rars'
        destinationPath = r'C:\Users\byqpz\Desktop\movies\destination'
        
        for root, dirs, files in os.walk(path):
            for filename in fnmatch.filter(files, '*.rar'):
                fullPath = os.path.join(root, filename)
                RarFile(fullPath).extract(destinationPath)
        

        【讨论】:

          【解决方案5】:

          如果您在 Windows 中,它对我有用。你需要去https://www.rarlab.com/rar_add.htm下载UnRAR for Windows - 命令行免费软件Windows UnRAR,执行它,解压到一个文件夹,并在你的代码中加入rarfile后的可执行路径:

          rarfile.UNRAR_TOOL = r"C:\FilePath\UnRAR.exe"
          

          【讨论】:

            猜你喜欢
            • 2017-09-17
            • 2015-06-27
            • 1970-01-01
            • 2016-12-08
            • 1970-01-01
            • 1970-01-01
            • 2015-10-01
            • 2015-05-23
            • 1970-01-01
            相关资源
            最近更新 更多