为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

芜湖不芜 2021-03-29 11:09:54
我目前在一个项目中,我实际上是在尝试基于一些分散的xml文件创建树结构,可惜的是,这些文件不是很一致地组织在一起。具体来说,我现在要说的是,给定许多具有给定文件扩展名的文件,我希望能够找到指示其布局的xml文档。幸运的是,文档始终具有相同的名称,但是遗憾的是,相对于我尝试链接到的媒体文件,文档并不总是位于相同的位置。我发现的最明智的解决方法是在目录结构中查找具有相似名称的最近文件。但是,我设法在Python中完成此操作的唯一方法是通过转到目录并使用os.walk查找要考虑的文件。可悲的是 这非常慢,我希望能够对大量媒体文件执行此操作,因此我正在寻找更优雅的解决方案。下面是一些示例代码,显示了我目前的方法:from os import listdirfrom os.path import isfile, join, realpathcurrent_directory = "/path/to/example.mp3"all_files = lambda path: [file for file in listdir(path) if isfile(join(path,file))]filename = "test.xml"found = Falsewhile 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,而且比实际需要的要复杂得多。有任何想法吗?
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

您的代码中没有递归树搜索,因此实际上不需要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 = 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


查看完整回答
反对 回复 2021-04-02
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信