Pythonic查找与特定目录位置最接近的给定名称的文件的方法
我目前在一个项目中,我基本上是在尝试基于一些分散的xml文件创建一个树结构,遗憾的是,这些文件的组织不是很一致。具体地说,我现在要说的是,给定多个具有给定文件扩展名的文件,我希望能够找到指示其布局的xml文档。幸运的是,文档始终具有相同的名称,但遗憾的是,相对于我尝试将其链接到的媒体文件,文档并不总是位于相同的位置。我发现的最合理的解决方法是在目录结构中查找名称相似的最近的文件。然而,我在Python中做到这一点的唯一方法是使用os.walk访问目录并查找考虑中的文件。不幸的是,这是相当缓慢,我希望能够做到这一点,为大量的媒体文件,所以我正在寻找一个更优雅的解决方案。下面是显示我当前方法的一些示例代码:Pythonic查找与特定目录位置最接近的给定名称的文件的方法,python,directory,traversal,Python,Directory,Traversal,我目前在一个项目中,我基本上是在尝试基于一些分散的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()?<代码>慢?任何其他的迭代算法都不慢——在任何情况下,您都需要对每个目录执行单独的操作系统调用。我恐怕没有完全遵循。您是否可能包含一些示例代码?