用Python方式查找最接近特定目录位置的具有给定名称的文件

我目前在一个项目中,我实际上是在尝试基于一些分散的xml文件创建树结构,可惜的是,这些文件不是很一致地组织在一起。具体来说,我现在要说的是,给定许多具有给定文件扩展名的文件,我希望能够找到指示其布局的xml文档。幸运的是,文档始终具有相同的名称,但是遗憾的是,相对于我尝试链接到的媒体文件,文档并不总是位于相同的位置。我发现的最明智的解决方法是在目录结构中查找具有相似名称的最近文件。但是,我设法在Python中完成此操作的唯一方法是通过转到目录并使用os.walk查找要考虑的文件。可悲的是 这非常慢,我希望能够对大量媒体文件执行此操作,因此我正在寻找更优雅的解决方案。下面是一些示例代码,显示了我目前的方法:


from os import listdir

from os.path import isfile, join, realpath


current_directory = "/path/to/example.mp3"

all_files = lambda path: [file for file in listdir(path) if isfile(join(path,file))]


filename = "test.xml"

found = False

while found is False:

    current_directory = current_directory[:current_directory.rfind("/")]

    current_files = all_files(current_directory)

    if filename in current_files:

        return current_files[current_files.index(filename)]

目录结构还不错,上面的方法可以一次到达两个文件实例,但是我仍然觉得上面的方法不是很pythonic,而且比实际需要的要复杂得多。有任何想法吗?


芜湖不芜
浏览 203回答 1
1回答

慕容森

您的代码中没有递归树搜索,因此实际上不需要os.walk()。如果我理解正确,您的代码将检查当前目录的确切名称,然后一直向上搜索FS。path = os.path.dirname("/path/to/file.mp3")target = "test.xml"top = "/"while True:    if os.path.isfile(os.path.join(path,target)):        #found        break    if path==top:   #alternative check for root dir: if os.path.dirname(path)==path        #not found        break        path=os.path.dirname(path)一种替代方法是使用生成父目录的生成器,但对我而言似乎过于复杂。尽管这可能更像pythonic:def walk_up(path,top):    while True:        yield path        if path==top: raise StopIteration        else: path=os.path.dirname(path)found = Nonefor p in walk_up(os.path.dirname("/path/to/file.mp3"),"/"):   p = os.path.join(p,target)   if os.path.isfile(p):      #found      found = p      breakelse:    #not found
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python