Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic查找与特定目录位置最接近的给定名称的文件的方法_Python_Directory_Traversal - Fatal编程技术网

Pythonic查找与特定目录位置最接近的给定名称的文件的方法

Pythonic查找与特定目录位置最接近的给定名称的文件的方法,python,directory,traversal,Python,Directory,Traversal,我目前在一个项目中,我基本上是在尝试基于一些分散的xml文件创建一个树结构,遗憾的是,这些文件的组织不是很一致。具体地说,我现在要说的是,给定多个具有给定文件扩展名的文件,我希望能够找到指示其布局的xml文档。幸运的是,文档始终具有相同的名称,但遗憾的是,相对于我尝试将其链接到的媒体文件,文档并不总是位于相同的位置。我发现的最合理的解决方法是在目录结构中查找名称相似的最近的文件。然而,我在Python中做到这一点的唯一方法是使用os.walk访问目录并查找考虑中的文件。不幸的是,这是相当缓慢,我

我目前在一个项目中,我基本上是在尝试基于一些分散的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,而且比实际需要的复杂得多。有什么想法吗?

是智能的:当
自上而下
True
时,您可以编辑
目录名来指定要检查的子目录

使用它,可能与某种状态机一起使用,将立即使您的代码更整洁-不需要
listdir
allfiles
rfind
黑客

代码中没有递归树搜索,因此确实不需要
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)
另一种方法是使用生成父dir的生成器,但我觉得这太复杂了。尽管这可能更像蟒蛇:

def walk_up(path,top):
    while True:
        yield path
        if path==top: raise StopIteration
        else: path=os.path.dirname(path)

found = None
for 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
      break
else:
    #not found

为什么要考虑<代码> OS.Walk()?<代码>慢?任何其他的迭代算法都不慢——在任何情况下,您都需要对每个目录执行单独的操作系统调用。我恐怕没有完全遵循。您是否可能包含一些示例代码?