1

我正在编写这个 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)
4

1 回答 1

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)

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

(在那个典型的os.walk循环中,root是目录并且f是文件名(没有路径),正是我们在正确的当前目录中运行子进程所需的,因此无需os.path.join计算完整路径)

于 2017-03-30T16:43:08.703 回答