Python搜索文件未知扩展

时间:2016-06-29 01:00:02

标签: python python-2.7 os.walk

python的新手,如果这是一个简单的问题,请道歉。我搜索了一下,发现有很多搜索具有未知名称和已知文件扩展名的文件,但不是已知名称和未知扩展名,如果没有人介意我可以使用一点帮助让我的代码正确运行。< / p>

我正在尝试编写的是一个接受目录和名称的Python函数,然后返回一个列表,其中包含所有文件(带有任何文件扩展名)的路径和具有该名称的目录。 directory参数将是计算机驱动器(例如C或F),name参数是要搜索的文件的名称(不带扩展名)。

以下是我的代码:

import os
import glob
def search_directory(directory,name):
    result = []
    for root,dirs,files in os.walk(directory,topdown=True):
        files_lower = []
        dirs_lower = []
        for i in files:
            files_lower.append(i.lower())
        for i in dirs:
            dirs_lower.append(i.lower())
        for i in glob.glob(name + '.*'):
            if i.lower() in files_lower:
                result.append(root + "\\" + files[files_lower.index(i.lower())])
        if name.lower() in dirs_lower:
            result.append(root + "\\" + dirs[dirs_lower.index(name.lower())])
    if (len(result) == 0):
        result.append("fileNotFound")
    return result

目前,如果该文件的副本位于我的程序目录中,我只能找到结果。如果那里没有副本,即使我的驱动器上有两个副本,它也找不到该文件。

我希望有人可以向我解释为什么会这样,以及如何纠正它,以便始终找到我正在搜索的文件。

1 个答案:

答案 0 :(得分:2)

为什么要重新搜索?这意味着当os.walk为您提供名称时,您最终会重复重新扫描目录,因此您只需使用os.path.splitext直接检查它们即可进行扩展分割。您还可以通过使其成为生成器函数来简化逻辑,因此您可以在找到文件时生成文件,更快地获得结果并避免在处理每个文件名时丢弃不必要的状态:

def search_directory(directory,name):
    name = name.lower()  # Convert up front in case it's pass mixed case
    for root, dirs, files in os.walk(directory,topdown=True):
        for e in files + dirs:
            if os.path.splitext(e)[0].lower() == name:
                yield os.path.join(root, e)

这使它成为一个生成器(如果你想要一个列表,你可以在list构造函数中包装调用以实现生成器),所以它不会告诉你是否没有点击,但调用者(或转换为list的包装函数)可以自己确定。如果需要,初始化为False的简单布尔值会在True之前设置为yield,但可以让您进行相同的检查,但通常不需要实用程序功能用这样的东西担心自己。