如何在python中获得os.walk的进度?

Tha*_*tiK 12 python os.walk

我有一段代码,我用它来搜索游戏文件的可执行文件并返回目录.我真的希望得到一些进展指标,指出有多远os.walk.我怎么做到这样的事情?

我试着去做startpt = root.count(os.sep)并测量它,但这只是给出os.walk目录树中的深度.

def locate(filelist, root=os.curdir): #Find a list of files, return directories.
    for path, dirs, files in os.walk(os.path.abspath(root)):
        for filename in returnMatches(filelist, [k.lower() for k in files]):
            yield path + "\\"
Run Code Online (Sandbox Code Playgroud)

Tha*_*tiK 6

我明白了这一点。

我使用 os.listdir 获取顶级目录列表,然后在 os.walk 返回的路径上使用 .split 函数,返回它当前所在的第一级目录。

这给我留下了一个顶级目录列表,我可以找到 os.walk 当前目录的索引,并将返回的索引与列表的长度进行比较,给我一个完成百分比。;)

这并没有给我带来顺利的进展,因为每个目录中完成的工作水平可能会有所不同,但平滑进度指示器对我来说并不关心。但是,通过将路径检查扩展到目录结构的更深处,可以轻松地实现这一点。

这是获取我的进度的最终代码:

def locateGameDirs(filelist, root=os.curdir): #Find a list of files, return directories.
    toplevel = [folder for folder in os.listdir(root) if os.path.isdir(os.path.join(root, folder))] #List of top-level directories
    fileset = set(filelist)

    for path, dirs, files in os.walk(os.path.abspath(root)):

        curdir = path.split('\\')[1] #The directory os.walk is currently in.

        try: #Thrown here because there's a nonexistant(?) first entry.
            youarehere = toplevel.index(curdir)
            progress = int(((youarehere)/len(toplevel))*100)
        except:
            pass

        for filename in returnMatches(filelist, [k.lower() for k in files]):
            yield filename, path + "\\", progress
Run Code Online (Sandbox Code Playgroud)

现在出于调试目的,我在代码中进一步执行此操作:

    for wow in locateGameDirs(["wow.exe", "firefox.exe", "vlc.exe"], "C:\\"):
    print wow
Run Code Online (Sandbox Code Playgroud)

有没有一个很好的小方法来摆脱 try/ except ?路径的第一次迭代似乎没有给我任何东西......


mzz*_*mzz 5

这取决于!

如果文件和目录的分布或多或少均匀,则可以通过假设每个顶层目录占用相同的时间来显示粗略的过程.但是,如果它们没有均匀分布,你就无法以低廉的价格找到它.你要么必须事先知道每个目录的填充程度,要么你必须os.walk整个东西两次(但这只有在你的实际处理比os.walk本身需要更长时间时才有用).

也就是说:假设您有4个顶级目录,每个目录包含4个文件.如果假设每个顶层目录占用了25%的进度,并且每个文件占用该目录的另外25%的进度,则可以显示一个很好的进度指示器.但是,如果最后一个子文件包含的文件比前几个更多,那么在您发现它之前,您的进度指示器将达到75%.如果os.walk本身就是瓶颈(而不是你的处理),那么你无法真正解决这个问题,而且它是一个任意的目录树(不是你预先知道每个子树将要花多长时间的那个).

当然,假设每个文件的成本大致相同......