Python脚本以递归方式在目录中打开.rar文件

时间:2017-03-30 16:37:06

标签: python bash ubuntu recursion unrar

我正在编写这个python脚本以递归遍历目录并使用ubuntu上的unrar实用程序打开所有.rar文件。由于某种原因,它将进入目录,列出一些内容,进入第一个子目录,打开一个.rar文件,然后打印父目录的所有其他内容而不进入它们。关于为什么会这样做的任何想法?我对python很新,所以就这么简单。

"""Recursively unrars a directory"""

import subprocess
import os


def runrar(directory):
    os.chdir(directory)

    dlist = subprocess.check_output(["ls"])
    for line in dlist.splitlines():
        print(line)
        if isRar(line):
            print("unrar e " + directory + '/' + line)
            arg = directory + '/' + line
            subprocess.call(['unrar', 'e', arg])

        if os.path.isdir(line):
            print 'here'
            runrar(directory + '/' + line)


def isRar(line):
    var = line[-4:]
    if os.path.isdir(line):
        return False
    if(var == ".rar"):
        return True
    return False


directory = raw_input("Please enter the full directory: ")
print(directory)

runrar(directory)

1 个答案:

答案 0 :(得分:1)

你的代码中有很多问题和笨拙的python使用,我可能无法列出它们。例子:

  • 使用os.chdir
  • 使用ls的输出来读取目录(非常错误,在Windows上无法移植!)
  • 使用os.walk 可以避免
  • 递归
  • 计算文件的扩展名更容易
  • 检查两次是否是目录...

我的建议:

for root,_,the_files in os.walk(path)
    for f in the_files:
        if f.lower().endswith(".rar"):
            subprocess.call(['unrar', 'e', arg],cwd=root)

循环遍历文件(和dirs,但我们忽略它们,我们通过将dir列表放入_变量,只是一个约定,但是一个有效的变量)来实现它,并使用{调用命令{1}}在本地更改目录,以便subprocess提取存​​档所在目录中的文件。

(在那个典型的unrar循环中,os.walk是目录而root是文件名(没有路径),正是我们需要在正确的当前目录中运行子进程,所以不需要f计算完整路径